gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:17:40 24 4
gpt4 key购买 nike

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

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)
}

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

const s8_VARB varb00[] = {
1,25,22,12,0,0,0,0,27,
1,1,36,12,0,0,0,0,22,
}

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

我试过的是这样的:

#define COMMA ,
#define mMM(cond, a,b,c,d,e,f,g,h) (cond) ? (a),(b),(c),(d),(e),(f),(g),(h) COMMA :

但这行不通。甚至没有编译,正如 gcc 提示的那样:

错误:':' 标记前的预期表达式

这个宏定义应该是什么样子的?这在 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)
};

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

关于创建一个可以根据参数省略一行的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29156934/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com