我有以下宏定义:
#define _mMRX0(xloc, yloc, code, data, supp, ref)
#define _mMRX1(xloc, yloc, code, data, supp, ref) (xloc), (yloc), (((code) + 0x80) & 0xFF), (((code) + 0x80) >> 8), (dDUMMYMRX), (supp), 0, (ref),
#define mMRX(cond, xloc, yloc, code, data, supp, ref) _mMRX##cond(xloc, yloc, code, data, supp, ref)
我想在以下来源上使用这些:
const unsigned char varb00[][8] = {
mMRX(0,25,22,12,0,0,27)
mMRX(1,25,22,12,0,0,27)
mMRX(1,1,29,12,0,0,21)
mMRX(1,1,36,12,0,0,22)
mMRX(1,25,22,1,0,0,27)
mMRX(1,1,29,1,0,0,21)
mMRX(1,1,36,2,0,0,22)
mMRX(((cfgSTORAGE)^1),24,8,1,0,0,3) // <- this is not yet working
mMRX(cfgSTORAGE,24,8,1,0,0,3) // <- this is not yet working
};
cfgSTORAGE
在配置文件中定义为0或1,作为编译的第一步。配置文件中有大约25个不同的
cfgXYZ
定义。有时只有cfgXYZ
,有时有异或的东西。所有这些都可以作为条件在第一个参数中使用。在编译过程中,第一个参数为0的文件被很好地省略了。但我对最后一行有意见。
我想扩展顶部的宏,以便在编译之前能够处理这样的条件
((cfgSTORAGE)^1)
,因此如果cfgSTORAGE
被定义为1,则不会编译最后一行。我怎么能这样做?(使用旧的ANSI-C编译器,因此没有可用的C++11)
最佳答案
这个怎么样:
#if cfgStorage
# define mMRX_CfgStorage _mMRX1
# define mMRX_NotCfgStorage _mMRX0
#else
# define mMRX_CfgStorage _mMRX0
# define mMRX_NotCfgStorage _mMRX1
#endif
const unsigned char varb00[][8] = {
mMRX(0,25,22,12,0,0,27)
mMRX(1,25,22,12,0,0,27)
mMRX(1,1,29,12,0,0,21)
mMRX(1,1,36,12,0,0,22)
mMRX(1,25,22,1,0,0,27)
mMRX(1,1,29,1,0,0,21)
mMRX(1,1,36,2,0,0,22)
mMRX_NotCfgStorage(24,8,1,0,0,3)
};