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

例子:

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

其中X是任意数量的参数

我需要这个,因为无论什么重载,可以用2或4个参数调用。

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

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


当前回答

#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 //

or

#define PRINT if(0)print

第一个语句注释掉PRINT指令,第二个语句因为NULL if条件而阻止PRINT指令。如果设置了优化,编译器应该剔除从未执行的指令,例如:If (0) print("hello world");或(0)(空白);

其他回答

我认为这是不可能的,你可以用双pares来假装……只要你不需要单独的参数。

#define macro(ARGS) some_complicated (whatever ARGS)
// ...
macro((a, b, c))
macro((d, e))
#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 //

or

#define PRINT if(0)print

第一个语句注释掉PRINT指令,第二个语句因为NULL if条件而阻止PRINT指令。如果设置了优化,编译器应该剔除从未执行的指令,例如:If (0) print("hello world");或(0)(空白);

虽然它是C99的一部分,所以应该适用于所有人

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

简单的例子:

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

C99方式,也支持vc++编译器。

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

变量数量用省略号(…)表示。 ISO C语法要求在“…”之前至少有一个固定参数。

例如,你可以输入:

#define DEBUGMSG ( int, ...)