Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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 无法从另一个调用#define宏_C - Fatal编程技术网

C 无法从另一个调用#define宏

C 无法从另一个调用#define宏,c,C,我有这些台词 #define LOG(fp, fmt, ...) fprintf(fp, "%s:%d: "fmt, __FILE__, __LINE__, ## __VA_ARGS__) #define OUT(fmt, ...) LOG(stdout, fmt, __VA_ARGS__) 编译器被证明是错误的。如何从内向外调用日志 错误消息: 日志中“')”标记之前应为表达式 当我将其用作OUT(“Hello world”)时出现扩展错误 简短的解释,因为我从评论中了解到这是代码中的一

我有这些台词

#define LOG(fp, fmt, ...) fprintf(fp, "%s:%d: "fmt, __FILE__, __LINE__, ## __VA_ARGS__) 
#define OUT(fmt, ...) LOG(stdout, fmt, __VA_ARGS__) 
编译器被证明是错误的。如何从内向外调用日志

错误消息:

  • 日志中“')”标记之前应为表达式
  • 当我将其用作
    OUT(“Hello world”)时出现扩展错误

  • 简短的解释,因为我从评论中了解到这是代码中的一部分:
    ###
    中的
    ###
    是预处理器的非标准扩展(最初来自gcc,现在也由clang支持)。它的效果是,如果在没有可变参数的情况下调用可变宏,则会删除多余的前逗号。也就是说,在哪里

    #define FOO(bar, ...) foo(bar, __VA_ARGS__)
    
    无法使用一个参数调用,因为它将扩展为
    foo(参数,)

    可以,因为逗号被自动删除,扩展名为
    foo(参数)

    因此,解决您的问题的方法是使用

    //                                     vv--- these are important here
    #define OUT(fmt, ...) LOG(stdout, fmt, ##__VA_ARGS__) 
    
    否则,在只有一个参数的
    OUT
    扩展中,
    LOG
    中的
    将不会为空,因为它是从

    LOG(stdout, "Hello, world.",)
    
    而不是

    LOG(stdout, "Hello, world.")
    
    …并且
    日志中
    ##
    之前的
    u VA_uargs_uu
    将不起作用。您得到编译器消息是因为在
    LOG
    的扩展中有一个额外的逗号(调用
    fprintf
    ,)结束)


    .

    简短的解释,因为我从评论中了解到这是代码中的一部分:
    ###
    中的
    ######
    是预处理器的非标准扩展(最初来自gcc,现在也由clang支持)。它的效果是,如果在没有可变参数的情况下调用可变宏,则会删除多余的前逗号。也就是说,在哪里

    #define FOO(bar, ...) foo(bar, __VA_ARGS__)
    
    无法使用一个参数调用,因为它将扩展为
    foo(参数,)

    可以,因为逗号被自动删除,扩展名为
    foo(参数)

    因此,解决您的问题的方法是使用

    //                                     vv--- these are important here
    #define OUT(fmt, ...) LOG(stdout, fmt, ##__VA_ARGS__) 
    
    否则,在只有一个参数的
    OUT
    扩展中,
    LOG
    中的
    将不会为空,因为它是从

    LOG(stdout, "Hello, world.",)
    
    而不是

    LOG(stdout, "Hello, world.")
    
    …并且
    日志中
    ##
    之前的
    u VA_uargs_uu
    将不起作用。您得到编译器消息是因为在
    LOG
    的扩展中有一个额外的逗号(调用
    fprintf
    ,)结束)


    .

    简短的解释,因为我从评论中了解到这是代码中的一部分:
    ###
    中的
    ######
    是预处理器的非标准扩展(最初来自gcc,现在也由clang支持)。它的效果是,如果在没有可变参数的情况下调用可变宏,则会删除多余的前逗号。也就是说,在哪里

    #define FOO(bar, ...) foo(bar, __VA_ARGS__)
    
    无法使用一个参数调用,因为它将扩展为
    foo(参数,)

    可以,因为逗号被自动删除,扩展名为
    foo(参数)

    因此,解决您的问题的方法是使用

    //                                     vv--- these are important here
    #define OUT(fmt, ...) LOG(stdout, fmt, ##__VA_ARGS__) 
    
    否则,在只有一个参数的
    OUT
    扩展中,
    LOG
    中的
    将不会为空,因为它是从

    LOG(stdout, "Hello, world.",)
    
    而不是

    LOG(stdout, "Hello, world.")
    
    …并且
    日志中
    ##
    之前的
    u VA_uargs_uu
    将不起作用。您得到编译器消息是因为在
    LOG
    的扩展中有一个额外的逗号(调用
    fprintf
    ,)结束)


    .

    简短的解释,因为我从评论中了解到这是代码中的一部分:
    ###
    中的
    ######
    是预处理器的非标准扩展(最初来自gcc,现在也由clang支持)。它的效果是,如果在没有可变参数的情况下调用可变宏,则会删除多余的前逗号。也就是说,在哪里

    #define FOO(bar, ...) foo(bar, __VA_ARGS__)
    
    无法使用一个参数调用,因为它将扩展为
    foo(参数,)

    可以,因为逗号被自动删除,扩展名为
    foo(参数)

    因此,解决您的问题的方法是使用

    //                                     vv--- these are important here
    #define OUT(fmt, ...) LOG(stdout, fmt, ##__VA_ARGS__) 
    
    否则,在只有一个参数的
    OUT
    扩展中,
    LOG
    中的
    将不会为空,因为它是从

    LOG(stdout, "Hello, world.",)
    
    而不是

    LOG(stdout, "Hello, world.")
    
    …并且
    日志中
    ##
    之前的
    u VA_uargs_uu
    将不起作用。您得到编译器消息是因为在
    LOG
    的扩展中有一个额外的逗号(调用
    fprintf
    ,)结束)


    。例如:

    OUT("%s", "Hello World");
    
    如果这样做,则
    ##
    是无用的,宏应该如下所示:

    #define LOG(fp, fmt, ...) fprintf((fp), "%s:%d: "fmt, __FILE__, __LINE__, __VA_ARGS__) 
    #define OUT(fmt, ...) LOG(stdout, fmt, __VA_ARGS__) 
    

    ..
    in
    OUT(fmt,…)
    意味着需要传递至少一个参数,然后只传递
    fmt
    。例如:

    OUT("%s", "Hello World");
    
    如果这样做,则
    ##
    是无用的,宏应该如下所示:

    #define LOG(fp, fmt, ...) fprintf((fp), "%s:%d: "fmt, __FILE__, __LINE__, __VA_ARGS__) 
    #define OUT(fmt, ...) LOG(stdout, fmt, __VA_ARGS__) 
    

    ..
    in
    OUT(fmt,…)
    意味着需要传递至少一个参数,然后只传递
    fmt
    。例如:

    OUT("%s", "Hello World");
    
    如果这样做,则
    ##
    是无用的,宏应该如下所示:

    #define LOG(fp, fmt, ...) fprintf((fp), "%s:%d: "fmt, __FILE__, __LINE__, __VA_ARGS__) 
    #define OUT(fmt, ...) LOG(stdout, fmt, __VA_ARGS__) 
    

    ..
    in
    OUT(fmt,…)
    意味着需要传递至少一个参数,然后只传递
    fmt
    。例如:

    OUT("%s", "Hello World");
    
    如果这样做,则
    ##
    是无用的,宏应该如下所示:

    #define LOG(fp, fmt, ...) fprintf((fp), "%s:%d: "fmt, __FILE__, __LINE__, __VA_ARGS__) 
    #define OUT(fmt, ...) LOG(stdout, fmt, __VA_ARGS__) 
    

    您使用的编译器是什么?对于
    OUT
    ,它给出了什么错误消息?错误消息1)日志中“')”标记之前的预期表达式,以及2)当我将其用作OUT(“Hello world”)时的扩展错误@A.