Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c中的##是什么?_C_Gcc_Syntax_C Preprocessor - Fatal编程技术网

c中的##是什么?

c中的##是什么?,c,gcc,syntax,c-preprocessor,C,Gcc,Syntax,C Preprocessor,我看到了这个片段: #define kthread_create(threadfn, data, namefmt, arg...) \ kthread_create_on_node(threadfn, data, -1, namefmt, ##arg) ##代表什么 当出现在宏外时,##的含义是什么 这会将传入的arg粘贴到宏扩展中。 例如: 扩展到: kthread_create_on_node(threadfn, data, -1, namefmt, foo, bar, doo);

我看到了这个片段:

#define kthread_create(threadfn, data, namefmt, arg...) \
    kthread_create_on_node(threadfn, data, -1, namefmt, ##arg)
  • ##
    代表什么
  • 当出现在宏外时,
    ##
    的含义是什么
  • 这会将传入的
    arg
    粘贴到宏扩展中。 例如:

    扩展到:

    kthread_create_on_node(threadfn, data, -1, namefmt, foo, bar, doo);
    

    与其他答案相反,这实际上是GCC扩展。直接在中粘贴变量args时,如果没有传递额外的args,则会出现问题。因此,当与
    \uu VA\u ARGS\uu
    或varargs变量(用
    argname…
    声明)一起使用时,GCC生成
    #
    。如果包含值,则粘贴;如果不包含值,则删除前面的逗号

    此扩展的文档包括:

    其次,当置于逗号和变量参数之间时,“##”标记粘贴运算符具有特殊意义。如果你写信

    #define eprintf(format, ...) fprintf (stderr, format, ##__VA_ARGS__)
    
    当使用eprintf宏时,变量参数被省略,那么“##”前面的逗号将被删除。如果传递空参数,则不会发生这种情况,如果“##”前面的标记不是逗号,也不会发生这种情况

    eprintf ("success!\n")
          ==> fprintf(stderr, "success!\n");
    
    对于唯一的宏参数是变量参数的情况,上面的解释是不明确的,因为试图区分没有任何参数是空参数还是缺少参数是没有意义的。在这种情况下,C99标准明确规定逗号必须保留,但是现有的GCC扩展用于吞并逗号。因此,CPP在符合特定的C标准时保留逗号,否则将其删除


    这是一个有趣的用法。我从来没有见过有可变参数的。通常我看到它用于连接参数和字符串。不,这个用例实际上是一个GCC扩展,对不起。
    eprintf ("success!\n")
          ==> fprintf(stderr, "success!\n");