0x9*_*x90 9 c syntax gcc c-preprocessor
我看过这个片段:
#define kthread_create(threadfn, data, namefmt, arg...) \
kthread_create_on_node(threadfn, data, -1, namefmt, ##arg)
Run Code Online (Sandbox Code Playgroud)
##
代表什么?##
时候它出现在一个宏?Ric*_*III 10
与其他答案相反,这实际上是GCC扩展.直接粘贴变量args时,如果没有传递额外的args则会出现问题.因此,GCC ##
与__VA_ARGS__
或使用varargs变量(声明为argname...
)时使用.如果它包含值,则粘贴,如果不包含,则删除以前的逗号.
该扩展的文档是在这里:
其次,'##'标记粘贴运算符在逗号和变量参数之间具有特殊含义.如果你写
Run Code Online (Sandbox Code Playgroud)#define eprintf(format, ...) fprintf (stderr, format, ##__VA_ARGS__)
当使用eprintf宏时,省略变量参数,然后删除'##'之前的逗号.如果传递空参数,则不会发生这种情况,如果"##"前面的标记不是逗号,则不会发生这种情况.
Run Code Online (Sandbox Code Playgroud)eprintf ("success!\n") ==> fprintf(stderr, "success!\n");
上面的解释对于唯一的宏参数是变量参数参数的情况是模棱两可的,因为试图区分根本没有参数是空参数还是缺少参数是没有意义的.在这种情况下,C99标准很清楚,逗号必须保留,但现有的GCC扩展名用于吞下逗号.因此,CPP在符合特定C标准时保留逗号,否则将丢弃.
归档时间: |
|
查看次数: |
3751 次 |
最近记录: |