首页 文章

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

提问于
浏览
-1

是否有一般方法来屏蔽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]); \
}

如果可能的话,我想要一个通用答案,而不仅仅是针对这个特定宏的解决方法 .

1 回答

  • 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 被调用,即使源中没有后跟括号 .

    编辑:根据下面的评论,在这种情况下似乎没有必要 . 虽然我曾经遇到过我需要它的情况......但它没有受到伤害 .

相关问题