一、主要目標
(由於visual studio通常包含很多開發環境,通常將其中c/c++的ide稱為visual c++ 20xx)
整理下visual c++ 2010下預定義的宏。做一下備忘和了解,在實際編碼中可以考慮使用部分宏作為判斷標准。
主要參考鏈接:http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.100).aspx
二、vc++ 2010中預定義宏
注意本文中提及的所有預定義宏都是無參數的,並且不能重定義。
1. __FILE__、__LINE__
這兩個預定義宏是c語言中定義的,主要用於標識代碼段所在的源文件名稱(全路徑或者文件名)以及當前位置在源文件中的行數。多用於錯誤跟蹤、預編譯報錯、程序異常跟蹤等,比如TRACE、ASSERT失敗的提示信息。
2. _CHAR_UNSIGNED
vc中附加定義的宏。主要用於說明char類型的數據,是有符號的還是無符號的。默認情況下char是無符號的。
在很多開源項目里面,使用cl或gcc編譯源碼時可能需要關注下char的正負:因為有符號的char在做數值運行遇到類型提升的情況可能會存在不確定性的行為(跟編譯器的實現有關)。
3. __FUNCDNAME__、__FUNCSIG__、__FUNCTION__
vc中定義的宏。僅在函數實現中使用有效。三個宏分別表示:編譯器修飾后的函數名稱、函數簽名、代碼中的函數名稱。
實際使用可參考下列代碼:
void exampleFunction() { printf("Function name: %s\n", __FUNCTION__); printf("Decorated function name: %s\n", __FUNCDNAME__); printf("Function signature: %s\n", __FUNCSIG__); // vc++ 2010的實際輸出 // ------------------------------------------------- // Function name: exampleFunction // Decorated function name: ?exampleFunction@@YAXXZ // Function signature: void __cdecl exampleFunction(void) }
4. _WIN32、_WIN64
vc中定義的宏。用於說明應用程序是基於win32或是win64平台的。
5. _DEBUG
vc中定義的宏。含義很明顯,用於標識當前程序是調試版本。
之所以單獨拿出來是因為 _DEBUG和DEBUG兩個宏經常混在一起,很容易讓人誤解到底該使用哪一個。
按照msdn上介紹和說明,幾乎多數資料都只有_DEBUG宏,這也是assert、TRACE等生效必須定義的宏。
那么DEBUG這個宏是從哪里來的呢? MFC程序里面通常會用DEBUG宏定義。你可以隨便找個mfc項目中的源代碼文件,輸入#ifdef DEBUG,然后轉到定義看看其實現。在atldef.h中,會看到如下定義:
#ifdef _DEBUG #ifndef DEBUG #define DEBUG #endif #endif
這樣就是比較顯然了。是mfc中預定義的宏,個人感覺像是防止用戶誤使用。
因此,在實際編碼中應該使用_DEBUG宏,不要使用DEBUG(即使已經定義了)。
