visual c++中預定義的宏


一、主要目標

(由於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)
}
View Code

 

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(即使已經定義了)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM