C 预处理器删除尾随逗号

2024-04-18

我有一个这样的宏:

#define C( a... ) ( char *[] ){ a, 0 }

这适用于非空参数:

C( "a", "b" ) => ( char *[] )( "a", "b", 0 }

但我想在提供空参数时删除尾随逗号:

C() => ( char *[] ){ , 0 }

这可能吗?


至少在 GCC 5.4.0 中,在 Cygwin 上(default -std=gnu11 https://gcc.gnu.org/onlinedocs/gcc-5.4.0/gcc/Standards.html),这似乎做你想做的(假设我正确理解你的问题):

#define C( a... ) ( char *[] ){ a 0 }
                                 ^ no comma!    
C( "a", "b", ) 
           ^ comma here
=> ( char *[] )( "a", "b", 0 }

C() 
=> ( char *[] ){ 0 }

测试用gcc -E并且没有其他命令行选项。

Edit正如@KerrekSB 指出的,这是不可移植的。这GCC 预处理器文档 https://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html有话要说(强调):

对于唯一的宏参数是可变参数参数的情况,上面的解释是不明确的[正如在这种情况下-编者。],因为试图区分根本没有参数是空参数还是缺失参数是没有意义的。在这种情况下,C99 标准明确指出必须保留逗号,但是现有的 GCC 扩展用来吞掉逗号。因此,当符合特定的 C 标准时,CPP 会保留逗号,否则会删除它。

所以上面的代码在 GCC 中工作得很好,但在其他编译器上可能不行。但是,它确实对我有用gcc -std=c90 -E (or c99, or c11).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 预处理器删除尾随逗号 的相关文章

随机推荐