我有一个这样的宏:
#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(使用前将#替换为@)