2008-10-03 63 views
2

我有以下預處理器divective:的#define TRACE(...)不工作在C++

#ifndef NDEBUG 
#define TRACE printf 
#else 
#define TRACE(...) 
#endif 

和使用例子是:

TRACE("TRACE: some parameter = %i\n", param); 

在C中的所有工作得很好當我建立這兩個調試和發佈版本,但在C++編譯器發出以下內容:

警告:無效字符在宏參數名

錯誤:'#define'中的參數列表嚴重中斷

並將這些警告和錯誤指向'TRACE(...)'指令。

如何正確寫入C++?

回答

1

你可以這樣做:

inline void TRACE(...) {} 
+0

問題是編譯器總是要評估參數。如果他們昂貴,你想讓他們關閉。因此TRACE類型的宏通常應該評估爲在釋放模式下清空代碼。 – 2008-10-03 14:36:47

0

什麼編譯器?對於它的價值,G ++ 4.3.1沒有任何問題。

+0

QXN Netrino QCC編譯器,gcc_ntox86版本2.95.3。據我瞭解,這是GCC與x86的QNX版本externsions。 – 2008-10-03 09:48:38

3

#define TRACE false ||

這接通TRACE(X,Y,Z)轉換成假|| (X,Y,Z)。由於x,y和z將是表達式,因此(x,y,z)計算爲z(逗號運算符)。 z必須是內置類型(要合法地傳遞給printf樣式函數),所以它應該在||的右邊有效。它不會被評估,但它必須是一個法律表達式(例如,你不能引用僅存在於DEBUG構建中的類成員)

Vararg宏是C99發明,它們不在C++ 98中但可能很好在C++ 0x

[編輯] - 使用||保證非評估

+0

問題是編譯器總是需要評估x,y和z。如果他們昂貴,你想讓他們關閉。 – 2008-10-03 14:35:51