有办法通过一个值来获得其宏吗?解决办法
有办法通过一个值来获得其宏吗?
如题
例如
#define XXX 100
有没有办法通过100得到XXX?
而且是通过宏的方式,因为这些是一系列资源ID,而类名的命名规则是在资源ID前加"C"
#define IDToClass(_X) C##_X 可以通过XXX来合成类的名字
new IDToClass(XXX) 即可得到一个XXX的对象,问题是怎么能得到XXX ?在函数的参数里怎么能保留这些信息?或者怎么能通过宏的值逆推回宏?
------解决方案--------------------
宏在编译之前已经替换掉了
------解决方案--------------------
无法逆向操作,编译器也做不到。
假设你定义 XXX 为100,也定义YYY为100,你现在给定100,结果到底是XXX还是YYY呢?
------解决方案--------------------
你想要ID名和ID值关联起来,可以这样:
如题
例如
#define XXX 100
有没有办法通过100得到XXX?
而且是通过宏的方式,因为这些是一系列资源ID,而类名的命名规则是在资源ID前加"C"
#define IDToClass(_X) C##_X 可以通过XXX来合成类的名字
new IDToClass(XXX) 即可得到一个XXX的对象,问题是怎么能得到XXX ?在函数的参数里怎么能保留这些信息?或者怎么能通过宏的值逆推回宏?
------解决方案--------------------
宏在编译之前已经替换掉了
------解决方案--------------------
无法逆向操作,编译器也做不到。
假设你定义 XXX 为100,也定义YYY为100,你现在给定100,结果到底是XXX还是YYY呢?
------解决方案--------------------
你想要ID名和ID值关联起来,可以这样:
- C/C++ code
enum MY_DEFINE { ID_1 = 0, ID_2, ... ID_NUM } const char NAME[ID_NUM] = {...}; // 名字 const long VALUE[ID_NUM] = {...}; // 值
------解决方案--------------------
没有可逆性
#define XXX 100
#define YYY 100
如果可以的话,那么该得出XXX还是YYY呢?
------解决方案--------------------
..才看到上面有人举过了..而且如此相似..
------解决方案--------------------
- C/C++ code
#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; }