如何制作可变参数宏(可变数量的参数)

时间:2009-03-25 02:08:15

标签: c g++ c-preprocessor variadic

我想在C中编写一个宏,它接受任意数量的参数,而不是特定的数字

示例:

#define macro( X )  something_complicated( whatever( X ) )

其中X是任意数量的参数

我需要这个,因为whatever已经过载,可以用2或4个参数调用。

我尝试过两次定义宏,但是第二个定义覆盖了第一个宏!

我正在使用的编译器是g ++(更具体地说,mingw)

5 个答案:

答案 0 :(得分:272)

C99方式,也得到C ++编译器的支持。

#define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__)

答案 1 :(得分:32)

__VA_ARGS__是执行此操作的标准方法。如果不需要,请不要使用特定于编译器的黑客。

我真的很生气,我无法对原帖发表评论。在任何情况下,C ++都不是C的超集。使用C ++编译器编译C代码真的很愚蠢。不要做Donny不做的事。

答案 2 :(得分:25)

我不认为这是可能的,你可以用双parens伪装它......只要你不需要单独的参数。

#define macro(ARGS) some_complicated (whatever ARGS)
// ...
macro((a,b,c))
macro((d,e))

答案 3 :(得分:10)

#define DEBUG

#ifdef DEBUG
  #define PRINT print
#else
  #define PRINT(...) ((void)0) //strip out PRINT instructions from code
#endif 

void print(const char *fmt, ...) {

    va_list args;
    va_start(args, fmt);
    vsprintf(str, fmt, args);
        va_end(args);

        printf("%s\n", str);

}

int main() {
   PRINT("[%s %d, %d] Hello World", "March", 26, 2009);
   return 0;
}

如果编译器不理解可变参数宏,您还可以使用以下任一方法去除PRINT:

#define PRINT //

#define PRINT if(0)print

第一个注释掉PRINT指令,第二个注释因为条件为NULL而阻止PRINT指令。如果设置了优化,编译器应该删除从未执行过的指令,如:if(0)print(“hello world”);或((无效)0);

答案 4 :(得分:4)

在这里解释了g +​​+,虽然它是C99的一部分所以应该适用于每个人

http://www.delorie.com/gnu/docs/gcc/gcc_44.html

快速示例:

#define debug(format, args...) fprintf (stderr, format, args)
相关问题