標籤:ati 名稱 article 預先處理 標準 原因 程式 post .com
前面一些篇目的內容作為一個在校生,很少用到,可能工作的人會見得多一點,但是第一次整體性的學習還是不希望有落下的東西,雖然不常用但至少要有個印象
那麼就進入第三篇《宏 __cplusplus》
在C與C++混合編寫的代碼中,我們常常會在標頭檔裡面看到如下的聲明:
#ifdef __cplusplusextern "C" {#endif //一些代碼#ifdef __cplusplus}#endif
這些類型的標頭檔可以被#include 到C檔案中進行編譯,也可以被#include 到C++檔案中進行編譯。
一般用於將C++代碼以標準C形式輸出,就是以C的形式被調用,但C++和C的編譯器還是不同的,上述方式使得C中調用C++代碼是安全的。
__cplusplus是cpp中的自訂宏,定義的這個宏表示這是一段cpp的代碼
代碼的含義就是:如果這是一段cpp的代碼,那麼加入extern “C”{ 和 }處理其中的代碼。
C++和C對產生的函數名字的處理是不一樣的,在編譯產生的彙編碼中,要對函數的名字進行一些處理。(由於還沒學彙編,具體原理可以看一下其他人分析:http://blog.csdn.net/thanklife/article/details/7362893)
由於extern “C”可以一直C++對函數名、變數名等符號進行名稱重整,因此編譯出的C目標檔案和C++目標檔案中的變數、函數名稱等符號都是相同的(否則不相同,原因在上一段提到),連結器可以可靠地對兩種類型的目標檔案進行連結。這樣該做法稱為了C與C++混用標頭檔的經典做法。
上述的代碼應用,請參見:http://blog.csdn.net/thanklife/article/details/7362893,好像這個部落格的前面是一個圖片,邊界不完整,後面有鍵盤敲的還是挺完整的,最後有相關的C函數以及檔案的擴充調用例子。
那麼,我們接著看下面部分。
我們可能認為__cplusplus 這個宏只有“被定義了”和“未被定義”兩種狀態。事實上卻並非如此,__cplusplus 這個宏通常被定義為一個整型值。而且隨著標準變化,__cplusplus 宏一般會是一個比以往表順更大的值。
比如在C++03標準中,__cplusplus的值被預定為199711L,而在C++11標準中,宏 __cplusplus 被預定義為201103L 。這點變化可以為代碼所用。
比如程式員在想確定代碼是使用支援C++11編譯器進行編譯時間,那麼就可以按下面的方法進行檢測:
#if __cplusplus < 201103L #error "should use C++11 implementation"#endif
這裡,使用了預先處理指令#error ,這使得不支援C++11的代碼編譯立即報錯並終止編譯。
測試效果如下:
C++11標準測試:
C++03標準測試:
就到這裡了,感謝您的閱讀,生活愉快~
(三)宏 __cplusplus C/C++混合編程