2012-05-14 65 views
3

我試圖讓泛型函數顯示錯誤消息,並顯示消息後程序可能退出。函數中的C++宏和默認參數

我希望函數能夠顯示發生錯誤的源文件和行。

參數列表:

1.char *desc //description of the error 
2.char *file_name //source file from which the function has been called 
3.u_int line //line at which the function has been called 
4.bool bexit=false //true if the program should exit after displaying the error 
5.int code=0 //exit code 

由於(4)和(5)我需要使用默認參數的函數定義,因爲我不希望他們被指定,除非程序應該退出做。

由於(2)和(3)我需要使用一個重定向到原始功能宏,像這樣的:

#define Error(desc, ???) _Error(desc,__FILE,__LINE__, ???) 

的問題是,我沒有看到如何將這些2種元素應該一起工作。

的應該什麼樣子例:

if(!RegisterClassEx(&wndcls)) 
    Error("Failed to register class",true,1); //displays the error and exits with exit code 1 

if(!p) 
    Error("Invalid pointer"); //displays the error and continues 
+1

http://stackoverflow.com/questions/679979/how-to-make-a-variadic-macro-variable-number-of-arguments(也許http://stackoverflow.com/questions/10582500/c -macro-and-default-arguments-in-function) – Vlad

+0

在__VA_ARGS__工作之前添加了'##'的確如此,我之前嘗試使用可變宏,但沒有##它沒有工作,謝謝 –

+0

歡迎: - ) – Vlad

回答

1

你不能重載在C99宏 - 你將需要兩個不同的宏。有了C11,使用_Generic有一些希望。

我開發了一些非常相似的東西 - Visual Studio的自定義警告生成器片段 - 使用宏。 GNU GCC有一些與MSVS兼容的類似設置。

#define STR2(x) #x 
#define STR1(x) STR2(x) 
#define LOC __FILE__ 「(「STR1(__LINE__)」) : Warning Msg: 「 
#define ERROR_BUILDER(x) printf(__FILE__ " (「STR1(__LINE__)」) : Error Msg: 」 __FUNCTION__ 」 requires 」 #x) 

以上線路照顧你的論點1至3.添加支持4將需要插入宏內的exit()電話。另外,如果您需要兩個不同的參數列表(具有默認參數的參數可以委派給其他宏),則創建兩個不同的宏包裝。

#define ERROR_AND_EXIT(msg, cond, errorcode) ERROR_BUILDER(msg) if (cond) exit(errorcode) 
#define ERROR_AND_CONT(msg) ERROR_BUILDER(msg) 

我已經提出了一個詳細的說明here(警告:這是我的博客 - 因此認爲這是一個無恥的插頭)。