C预处理程序删除结尾的逗号

西诺尔·尤克里尔

我有一个这样的宏:

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

这适用于非空参数:

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

但是,当我提供空参数时,我想删除结尾的逗号:

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

这可能吗?

x

至少在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C预处理程序是否删除“&*”的实例?

来自分类Dev

C预处理程序指针混乱

来自分类Dev

#define之外的C预处理程序串联

来自分类Dev

for循环中的C预处理程序串联

来自分类Dev

C预处理程序是否在运行?

来自分类Dev

扩展单个C预处理程序指令

来自分类Dev

C预处理程序:及早评估宏

来自分类Dev

C ++预处理程序串联操作

来自分类Dev

C预处理程序宏扩展串联

来自分类Dev

C中的预处理程序指令

来自分类Dev

C预处理程序宏多个参数

来自分类Dev

C预处理程序的默认添加

来自分类Dev

C预处理程序指令和链接

来自分类Dev

解释C预处理程序代码

来自分类Dev

C预处理程序如何工作?

来自分类Dev

C预处理程序宏扩展串联

来自分类Dev

C预处理程序:动态#Define创建

来自分类Dev

C预处理程序是否在运行?

来自分类Dev

删除预处理程序代码时重复的符号

来自分类Dev

C预处理程序如何处理循环依赖关系?

来自分类Dev

此预处理程序指令C / C ++所需的说明

来自分类Dev

此预处理程序指令C / C ++所需的解释

来自分类Dev

C ++预处理程序位置代码:: blocks?

来自分类Dev

此无括号的C预处理程序定义安全吗?

来自分类Dev

C预处理程序优先级

来自分类Dev

保存C ++预处理程序宏的原始值

来自分类Dev

C预处理程序:__ COUNTER__的自己的实现

来自分类Dev

C预处理程序实际上是如何工作的?

来自分类Dev

如何为C#预处理程序符号定义值?