gpt4 book ai didi

C:如何屏蔽宏参数中的逗号?

转载 作者:行者123 更新时间:2023-11-30 14:55:01 26 4
gpt4 key购买 nike

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]); \
}

如果可能的话,我想要一个一般性的答案,而不仅仅是特定于这个特定宏的解决方法。

最佳答案

使用括号屏蔽逗号,然后通过特殊的 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,即使它在源代码中后面没有括号。

编辑:根据下面的评论,在这种情况下似乎没有必要。虽然我确信我曾经遇到过需要它的情况...而且它并没有什么坏处。

关于C:如何屏蔽宏参数中的逗号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46310987/

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