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__)
..
inOUT(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__)
..
inOUT(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__)
..
inOUT(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.