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中是否可行?
您只能使用常量数据初始化数组.根据定义,条件语句不是常量的(即使编译器在编译时已知它).
相反,你可以这样做:
#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不可用,您可以像以前一样为每个参数命名.