【问题标题】:can I have a C macro that accepts undefined number of parameters? [duplicate]我可以有一个接受未定义数量参数的 C 宏吗? [复制]
【发布时间】:2012-06-14 17:40:09
【问题描述】:

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

我想在基本 C 语言中有一个日志宏,它接受类似于printf 的参数并记录它们。但是,我希望它的记录方式(日志级别、文件与stderr 等)在编译时设置,而不是运行时设置;如果我将参数设置为忽略低级日志记录,则该方法什么都不做,并希望在代码之外进行优化。

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

由于我怀疑答案是我做不到,还有另一种方法可以在基本 C 中实现我想要的(我不能使用 C++ 或 boost)。

【问题讨论】:

    标签: c logging macros


    【解决方案1】:

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

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

    例子:

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

    【讨论】:

      【解决方案2】:

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

      语法如下:

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

      【讨论】:

        【解决方案3】:
        【解决方案4】:

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

        #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

        【讨论】:

          猜你喜欢
          • 2011-12-15
          • 1970-01-01
          • 2021-06-12
          • 2011-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多