是否有一般方法来屏蔽C中宏参数中的注释?我知道括号可以用于此目的,但是如果添加的括号导致宏输出中出现语法错误,则无法使用括号。我听说({})可以屏蔽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]); \
}
如果可能的话,我想要一个通用答案,而不仅仅是针对这个特定宏的解决方法。
答案 0 :(得分:0)
使用括号屏蔽逗号,然后通过以下示例中定义的特殊unparen
宏传递它们:
#include <stdio.h>
#define really_unparen(...) __VA_ARGS__
#define invoke(expr) expr
#define unparen(args) invoke(really_unparen args)
#define fancy_macro(a) printf("%s %s\n", unparen(a))
int main()
{
fancy_macro(("Hello", "World"));
}
这里的诀窍是invoke
宏强制进行额外扩展,允许调用really_unparen
,即使源中没有后跟括号。
编辑:根据下面的评论,在这种情况下似乎没有必要。虽然我确定我已经遇到了某个时候的情况......并且它并没有受到伤害。