我想在我的代碼來定義日誌級別:不需要重新定義
#define INFO 1
#define WARNING 2
#define ERROR 4
#define DEBUG 8
但在其他一些標準的Microsoft庫錯誤已經被定義,看上去就像換句話說也是保留。如何處理這種情況?
我想在我的代碼來定義日誌級別:不需要重新定義
#define INFO 1
#define WARNING 2
#define ERROR 4
#define DEBUG 8
但在其他一些標準的Microsoft庫錯誤已經被定義,看上去就像換句話說也是保留。如何處理這種情況?
不幸的是,微軟定義了很多宏,無論你喜不喜歡它們,它們都會被注入到你的代碼中。所以你最好不要重複他們的錯誤並避免定義宏。
您可以做的最好的事情是定義常量而不是宏,並將它們放在名稱空間中以避免名稱衝突。例如:
namespace Log
{
const int Info = 1;
const int Warning = 2;
const int Error = 4;
const int Debug = 8;
}
那麼你會在你的代碼中使用它們作爲Log::Info
,Log::Error
等。
編輯:由於紅花在評論中指出,你很可能會在這種情況下,最好使用enum
:
enum LogLevel
{
Info = 1;
Warning = 2;
Error = 4;
Debug = 8;
}
在這種情況下,你不需要用enum
類型的前綴值名稱,只需使用此類型的變量即可。例如:
LogLevel level = Warning;
這有提供類型安全的優勢。您也可以重複使用其他enum
的名稱。
'枚舉'會在這裏更好。 – 2013-01-03 14:36:30
@Tinctorius是的,爲此目的會更好。我正在更新我的答案。 – Gorpik
它提供的另一個優點是'const int'可能被視爲一個全局變量,取決於它的用途('int * p =(int *)&Warning; * p = 0')。 'const int's只不過是'int',通過這個名字*有限制訪問*,優化器必須說服底層存儲在內聯之前永遠不會改變。 – 2013-01-03 14:57:28
你想在這種情況下最終的結果是什麼?你有什麼嘗試? – 2013-01-03 14:23:36