216

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

例子:

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

其中X是任意数量的参数

我需要这个,因为whatever它重载并且可以用 2 或 4 个参数调用。

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

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

4

6 回答 6

325

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

#define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__)
于 2009-03-25T02:16:27.753 回答
44

__VA_ARGS__是标准的做法。如果不需要,不要使用编译器特定的技巧。

我真的很生气,我不能对原始帖子发表评论。无论如何,C++ 不是 C 的超集。用 C++ 编译器编译 C 代码真的很愚蠢。不要做唐尼不做的事。

于 2011-09-04T21:25:30.390 回答
31

我认为这是不可能的,你可以用双括号来伪造它......只要你不需要单独的论点。

#define macro(ARGS) some_complicated (whatever ARGS)
// ...
macro((a,b,c))
macro((d,e))
于 2009-03-25T02:14:46.913 回答
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 if 条件而阻止 PRINT 指令。如果设置了优化,编译器应该删除从未执行过的指令,例如: if(0) print("hello world"); 或((无效)0);

于 2009-03-26T20:15:23.860 回答
7

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

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

快速示例:

#define debug(format, args...) fprintf (stderr, format, args)
于 2009-03-25T02:13:59.990 回答
0

• 可变数量的参数用省略号 (...) 表示 • ISO C 的语法要求在“...”之前至少有一个固定参数</p>

例如,您可以键入:

#define DEBUGMSG ( int, ...)
于 2021-10-11T14:27:57.897 回答