2013-01-03 41 views
0

我想在我的代碼來定義日誌級別:不需要重新定義

#define INFO 1 
#define WARNING 2 
#define ERROR 4 
#define DEBUG 8 

但在其他一些標準的Microsoft庫錯誤已經被定義,看上去就像換句話說也是保留。如何處理這種情況?

+0

你想在這種情況下最終的結果是什麼?你有什麼嘗試? – 2013-01-03 14:23:36

回答

0

不幸的是,微軟定義了很多宏,無論你喜不喜歡它們,它們都會被注入到你的代碼中。所以你最好不要重複他們的錯誤並避免定義宏。

您可以做的最好的事情是定義常量而不是宏,並將它們放在名稱空間中以避免名稱衝突。例如:

namespace Log 
{ 
    const int Info = 1; 
    const int Warning = 2; 
    const int Error = 4; 
    const int Debug = 8; 
} 

那麼你會在你的代碼中使用它們作爲Log::InfoLog::Error等。

編輯:由於紅花在評論中指出,你很可能會在這種情況下,最好使用enum

enum LogLevel 
{ 
    Info = 1; 
    Warning = 2; 
    Error = 4; 
    Debug = 8; 
} 

在這種情況下,你不需要用enum類型的前綴值名稱,只需使用此類型的變量即可。例如:

LogLevel level = Warning; 

這有提供類型安全的優勢。您也可以重複使用其他enum的名稱。

+0

'枚舉'會在這裏更好。 – 2013-01-03 14:36:30

+0

@Tinctorius是的,爲此目的會更好。我正在更新我的答案。 – Gorpik

+0

它提供的另一個優點是'const int'可能被視爲一個全局變量,取決於它的用途('int * p =(int *)&Warning; * p = 0')。 'const int's只不過是'int',通過這個名字*有限制訪問*,優化器必須說服底層存儲在內聯之前永遠不會改變。 – 2013-01-03 14:57:28