簡體   English   中英

如何制作可變參數宏(可變數量的參數)

[英]How to make a variadic macro (variable number of arguments)

我想在 C 中編寫一個宏,它接受任意數量的參數,而不是特定數量

例子:

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

其中X是任意數量的參數

我需要這個,因為whatever被重載了,可以用 2 或 4 個參數調用。

我嘗試定義宏兩次,但第二個定義覆蓋了第一個!

我正在使用的編譯器是 g++(更具體地說,mingw)

C99方式,VC++編譯器也支持。

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

__VA_ARGS__是執行此操作的標准方法。 如果不需要,不要使用編譯器特定的技巧。

我真的很生氣,我不能對原始帖子發表評論。 在任何情況下,C++ 都不是 C 的超集。 用 C++ 編譯器編譯你的 C 代碼真的很傻。 不要做唐尼不做的事。

我認為這是不可能的,你可以用雙括號來偽造它......只要你不需要單獨使用 arguments。

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

或者

#define PRINT if(0)print

第一個注釋掉 PRINT 指令,第二個由於 NULL if 條件而阻止 PRINT 指令。 如果設置了優化,編譯器應該刪除從未執行過的指令,例如: if(0) print("hello world"); 或((無效)0);

在這里解釋了 g++,雖然它是 C99 的一部分,所以應該適用於每個人

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

快速示例:

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

• arguments 的變量號用省略號 (...) 表示 • ISO C 的語法要求在“...”之前至少有一個固定參數

例如,您可以鍵入:

#define DEBUGMSG ( int, ...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM