创建一个可以根据参数省略行的宏

use*_*122 4 c gcc c-preprocessor

我有以下几行代码,由数据库导出程序创建:

typedef struct _s8_VARB
{
    unsigned char _byte[8];
} s8_VARB;

const s8_VARB varb00[] = {
    mMM(1,25,22,12,0,0,0,0,27)
    mMM(0,1,29,12,0,0,0,0,21)
    mMM(1,1,36,12,0,0,0,0,22)
}
Run Code Online (Sandbox Code Playgroud)

mMM是一个宏,我想用一个在编译期间产生以下数据的功能来定义:

const s8_VARB varb00[] = {
    1,25,22,12,0,0,0,0,27,
    1,1,36,12,0,0,0,0,22,
}
Run Code Online (Sandbox Code Playgroud)

所以它基本上应该检查第一个参数.如果为0,则应省略该完整行.如果为1,则所有参数(第1个除外)应该"放在行上",以逗号结尾.

我试过的是这个:

#define COMMA ,
#define mMM(cond, a,b,c,d,e,f,g,h)  (cond) ? (a),(b),(c),(d),(e),(f),(g),(h) COMMA :
Run Code Online (Sandbox Code Playgroud)

但这不起作用.甚至没有编译,因为gcc抱怨:

error: expected expression before ':' token

这个宏定义应该如何?这在C中是否可行?

a3f*_*a3f 6

您只能使用常量数据初始化数组.根据定义,条件语句不是常量的(即使编译器在编译时已知它).

相反,你可以这样做:

#define _mMM0(...)
#define _mMM1(...)  {__VA_ARGS__},
#define mMM(cond, ...) _mMM##cond(__VA_ARGS__)

const unsigned char varb00[][8] = {
      mMM(1,25,22,12,0,0,0,0,27)
      mMM(0,1,29,12,0,0,0,0,21)
      mMM(1,1,36,12,0,0,0,0,22)
};
Run Code Online (Sandbox Code Playgroud)

我删除了结构并直接用它的唯一成员替换它.如果C99不可用,您可以像以前一样为每个参数命名.

  • @ user0815不,我错了!:-) C99为`enumerator-list`添加了尾随逗号,C89已经有'initializer-list`的尾随逗号.再次编辑我的答案. (3认同)