我有以下宏定义:
#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作为编译的第1步。
配置文件中有大约25个不同的cfgXYZ
定义。有时仅cfgXYZ
,有时与XOR相关。所有这些都可能在第一个参数中用作条件。
在编译期间,第1个参数为0的文件很好地省略了。但我在最后一行遇到了问题。
我想扩展顶部的宏以便在编译之前处理这些条件((cfgSTORAGE)^1)
,因此如果cfgSTORAGE
定义为1,则不会编译最后一行。< / p>
我怎么能这样做? (使用旧的Ansi-c编译器,因此没有花哨的C ++ 11可用)
答案 0 :(得分:0)
这个怎么样:
#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)
};
答案 1 :(得分:0)
您尝试做的事情可以通过多种方式实现,但您尝试的方式并不是很好的
#define mMRX(cond, xloc, yloc, code, data, supp, ref) _mMRX##cond(xloc, yloc, code, data, supp, ref)
预处理器将首先解析串联运算符,导致_mMRXcond
未被定义;用cond替换cond的实际值发生在后期(编译时),因为它和参数传递在
要获得不同的行为,取决于cond的值,您可以编写两个行为:
#if cfgStorage
....
#else
....
#endif
或写一个多行宏
#define mMRX(cond, xloc, yloc, code, data, supp, ref) {\
if(cond)\
_mMRX1(xloc, yloc, code, data, supp, ref);\
else\
_mMRX0(xloc, yloc, code, data, supp, ref);\
}