我可以使用接受未定义数量参数的C宏吗?

时间:2012-06-11 19:43:01

标签: c logging macros

  

可能重复:
  How to make a variadic macro (variable number of arguments)

我希望在基本C中有一个日志宏,它接受类似于printf的参数并记录它们。但是,我希望它的记录(日志级别,文件vs stderr等)是在编译时设置的,而不是运行时;如果我设置参数来忽略低级别的日志记录,那么该方法无所事事并希望从代码中优化。

到目前为止,我有一个宏,它是根据编译时定义的参数定义的。如果定义了参数,则日志记录将转到我的日志方法(以记录到文件),否则将转到stderr。但是,我只能将一个字符串传递给这个宏。 log方法能够获取无限数量的参数,并使用printf语法工作。我想知道是否有办法设置我的宏,以便它将无限数量的参数传递给日志文件?

因为我怀疑答案是我不能这样做是否有另一种在基本C中实现我想要的方法(我不能使用C ++或者提升)。

4 个答案:

答案 0 :(得分:7)

C99具有可以接受可变数量参数的宏。它们被称为可变参数宏

http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

示例:

#define eprintf(...) fprintf (stderr, __VA_ARGS__)
#define dfprintf(stream, ...) fprintf(stream, "DEBUG: " __VA_ARGS__)

答案 1 :(得分:2)

是的,你可以。 C99支持此out of the box

语法如下:

#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)

答案 2 :(得分:0)

答案 3 :(得分:0)

您可以使用省略号来定义一个带有可变数量参数的宏:

#define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)

http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/4/html/Using_the_GNU_Compiler_Collection/variadic-macros.html