我有一个这样的宏:
#define C( a... ) ( char *[] ){ a, 0 }
这适用于非空参数:
C( "a", "b" ) => ( char *[] )( "a", "b", 0 }
但是,当我提供空参数时,我想删除结尾的逗号:
C() => ( char *[] ){ , 0 }
这可能吗?
至少在GCC 5.4.0的Cygwin(默认为-std=gnu11
)上,这似乎可以满足您的要求(假设我正确理解了您的问题):
#define C( a... ) ( char *[] ){ a 0 }
^ no comma!
C( "a", "b", )
^ comma here
=> ( char *[] )( "a", "b", 0 }
C()
=> ( char *[] ){ 0 }
经过测试,gcc -E
没有其他命令行选项。
编辑正如@KerrekSB指出的那样,这是不可移植的。在GCC预处理器的文档有这样一段话(强调):
上面的解释对于唯一的宏参数是可变参数参数的情况是模棱两可的(例如在这种情况下,Ed。),因为试图区分根本没有参数是空参数还是缺少参数是没有意义的。在这种情况下,C99标准明确规定必须保留逗号,但是现有的GCC扩展用于吞下逗号。因此,CPP在符合特定的C标准时会保留逗号,否则将其删除。
因此,以上内容在GCC中可以正常运行,但在其他编译器上可能无法正常运行。但是,它确实对我有用gcc -std=c90 -E
(或c99
,或c11
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句