如何评估宏参数中的逻辑语句

时间:2015-03-20 08:52:21

标签: c c-preprocessor

我有以下宏定义:

#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可用)

2 个答案:

答案 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);\
                       }