(三)宏 __cplusplus C/C++混合編程

來源:互聯網
上載者:User

標籤: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++混合編程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.