【发布时间】:2017-09-19 23:11:35
【问题描述】:
有没有一种通用的方法来屏蔽 C 中宏参数中的 cmets?我知道括号可以用于此目的,但在添加括号导致宏输出中的语法错误的情况下,这将不起作用。我听说 ({ }) 可以在 GCC 中屏蔽逗号,但我需要此代码也可以在 VC++ 中工作(最近的版本之一确实符合关于宏中逗号的 C 标准)。在我的情况下,我也不能使用可变参数宏。
我正在尝试做的具体情况是这样的(lengthof 是在别处定义的宏)。我正在尝试为整个事情编写一个宏,因为这将被多次使用,并且拥有多宏解决方案会添加大量额外的测试代码。
#define TEST_UNFUNC(func, res_type, res_set, op_type, op_set) \
{ \
static const res_type res[] = res_set; \
static const op_type op[] = op_set; \
int i; \
for (i = 0; i < MIN(lengthof(res), lengthof(op)); i++) \
assert(func(op[i]) == res[i]); \
}
如果可能的话,我想要一个一般性的答案,而不仅仅是针对这个特定宏的解决方法。
【问题讨论】:
-
您能否更具体地说明这些逗号的来源以及它们需要“屏蔽”的内容?您是否希望能够做类似
MYMACRO(1, 2, 3)的事情并以某种方式表明1, 2是一个论点? -
括号将屏蔽逗号,但如果没有可变参数宏,您将很难将它们从宏输出中删除。 (好吧,IDK没有他们怎么办,也许你会想出一些办法。)
-
@PSkocik 现在没有可变参数宏吗?
-
@o11c OP,它会出现 :(
-
...真正的答案可能是:使用静态函数,并允许它被内联。
标签: c macros c-preprocessor