如题例如
#define XXX 100有没有办法通过100得到XXX?而且是通过宏的方式,因为这些是一系列资源ID,而类名的命名规则是在资源ID前加"C"#define IDToClass(_X) C##_X 可以通过XXX来合成类的名字new IDToClass(XXX) 即可得到一个XXX的对象,问题是怎么能得到XXX ?在函数的参数里怎么能保留这些信息?或者怎么能通过宏的值逆推回宏?

解决方案 »

  1.   

    无法逆向操作,编译器也做不到。
    假设你定义 XXX 为100,也定义YYY为100,你现在给定100,结果到底是XXX还是YYY呢?
      

  2.   

    哦,了解,主要是不想用switch或者if,一共一百多个类,写在一起的话,switch有点让人受不了。看来也只能如此了。木办法,头又不让我把类的实例化放在外面,实际个人感觉这样更灵活,唯一的缺点是,内存管理分开了。在外部申请,在内部释放。(这里的内部是指这个switch所在的类)否则,每次增加相关类,还要再加长这个switch。
      

  3.   

    你想要ID名和ID值关联起来,可以这样:enum MY_DEFINE
    {
      ID_1 = 0,
      ID_2,
      ...
      ID_NUM
    }const char NAME[ID_NUM] = {...};  // 名字
    const long VALUE[ID_NUM] = {...}; // 值
      

  4.   

    没有可逆性
    #define XXX 100
    #define YYY 100
    如果可以的话,那么该得出XXX还是YYY呢?
      

  5.   


    #define MAKE_MACS_DATA(_X) {_X, #_X}typedef struct _MAC_STRING 
    {
    DWORD dwValue;
    CHAR szMacString[1024];
    }MAC_STRING;BOOL NMac::GetMacString_Error(int nError, _bstr_t *pbStrMac)
    {
    int i;
    int nCount;
    static MAC_STRING table[] = 
    {
    MAKE_MACS_DATA(ERROR_SUCCESS), 
    MAKE_MACS_DATA(ERROR_INVALID_FUNCTION), 
    MAKE_MACS_DATA(ERROR_FILE_NOT_FOUND), 
    ...
    MAKE_MACS_DATA(ERROR_AUDITING_DISABLED), 
    MAKE_MACS_DATA(ERROR_ALL_SIDS_FILTERED)
    }; nCount = sizeof(table) / sizeof(MAC_STRING); for(i=0; i<nCount; i++)
    {
    if(nError == table[i].dwValue)
    {
    *pbStrMac = table[i].szMacString;
    return TRUE;
    }
    }

    *pbStrMac = "";
    return FALSE;}