2010-01-08 15 views
3
n個

可能重複:
C/C++: How to make a variadic macro (variable number of arguments)宏與論據

只是想知道,如果這是在所有可能的,所以不是即時通訊目前是如何處理的日誌記錄和消息有多個參數,即時通訊有對於每種情況具有許多不同的宏,例如:

#define MSG(   msg         ) 
#define MSG1(   fmt, arg1        ) 
#define MSG2(   fmt, arg1, arg2      ) 
#define MSG3(   fmt, arg1, arg2, arg3     ) 
#define MSG4(   fmt, arg1, arg2, arg3, arg4   ) 
#define MSG5(   fmt, arg1, arg2, arg3, arg4, arg5  ) 
#define MSG6(   fmt, arg1, arg2, arg3, arg4, arg5, arg6) 

是否有任何方法來定義一個宏在接受任何數量的參數?

感謝

+3

沒有*標準*的方式。但是,最常用的編譯器支持可變宏。不過,我會讓其他人發佈這個答案。 :) – GManNickG 2010-01-08 09:45:23

+2

@GMan我會讓問題的鬼過去的回答:http://stackoverflow.com/questions/679979/cc-how-to-make-a-variadic-macro-variable-number-of-arguments – 2010-01-08 09:47:35

+0

@G男人更好的答案比什麼都沒有,但? – 2010-01-08 09:52:36

回答

2

好,因爲@GMan不希望把他們作爲自己的答案,看看variadic macros這是C99標準的一部分。

雖然你的問題被標記爲C++。變量宏不是C++標準的一部分,但它們仍然受到大多數編譯器的支持:GCC和MSVC++從MSVC2005開始。

+2

,因爲你想要定義'MSG1(fmt,arg1)我敢打賭你想用'printf'之類的東西? – 2010-01-08 09:54:41

+0

許多事情都是誠實的,都是格式化的字符串,但會輸出到UI,日誌文件和可能的消息框中。 但是是的,你是對的,這是C不是C++,將會給變量宏一個嘗試 謝謝 – Stowelly 2010-01-08 09:58:05

+2

當你玩的可變宏,這是一個無恥的插件,我給了另一個問題的答案http:// stackoverflow .com/questions/1872220/is-it-it-it-it-to-iterate-over-arguments-in-variadic-macros/1872506#1872506 – 2010-01-08 10:01:20

2

以下是我用來生成異常宏 - 有沒有需要複雜的宏,其中C++目前不支持:

#define CSVTHROW(msg)   \ 
{         \ 
    std::ostringstream os;   \ 
    os << msg;      \ 
    throw CSVED::Exception(os.str()); \ 
}        \ 

在使用它可以讓你說這樣的話:

CSVTHROW("Problem caused by " << x << " being less than " << y); 

您可以輕鬆地將throw語句替換爲寫入日誌。