亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

結合C+和C-#ifdef_cplusplus是如何工作的?

結合C+和C-#ifdef_cplusplus是如何工作的?

C++
慕蓋茨4494581 2019-06-29 14:54:22
結合C+和C-#ifdef_cplusplus是如何工作的?我正在做一個有很多遺產的項目C密碼。我們已經開始用C+編寫,目的是最終轉換遺留代碼。我有點搞不懂C與C+交互。我理解通過包裝C代碼extern "C"C+編譯器不會損壞C代碼的名稱,但我不完全確定如何實現這一點。所以,在每個C頭文件(在包含守衛之后),我們有#ifdef __cplusplusextern "C" {#endif在底部,我們寫#ifdef __cplusplus}#endif在這兩者之間,我們有我們所有的包含,類型和功能原型。我有幾個問題,看看我是否正確地理解了這一點:如果我有一個C+文件A.hh,其中包括C頭文件B.H,包括另一個C頭文件C.H,這是如何工作的?我認為當編譯器進入B.H時,__cplusplus將被定義,因此它將用extern "C"(和__cplusplus將不會在此塊中定義)。所以,當它進入C.H的時候,__cplusplus將不定義代碼,也不會將代碼包裝在extern "C"..這是對的嗎?包裝一段代碼有什么問題嗎?extern "C" { extern "C" { .. } }?第二個extern "C"做?我們不把這個包裝放在.c文件上,只放在.h文件上。那么,如果一個函數沒有原型,會發生什么呢?編譯器認為它是C+函數嗎?我們還使用了一些第三方代碼,這些代碼是在C,而且沒有這種包裝。每當我從那個庫中包含一個標題時,我就會將extern "C"圍繞#包括。這是處理這個問題的正確方法嗎?最后,這是個好主意嗎?我們還有什么要做的嗎?我們要混合C和C+在可預見的將來,我想確保我們涵蓋了我們所有的基地。
查看完整描述

3 回答

?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

  1. extern "C"不改變__cplusplus宏。它只是更改了包裝聲明的鏈接和名稱損壞。

  2. 你可以筑巢extern "C"街區相當愉快。

  3. 如果您編譯.c文件作為C+,那么任何東西都不是在extern "C"塊,并且沒有extern "C"Prototype將被視為C+函數。如果將它們編譯為C,那么一切當然都是C函數。

  4. 您可以通過這種方式安全地混合C和C+。


查看完整回答
反對 回復 2019-06-29
?
拉丁的傳說

TA貢獻1789條經驗 獲得超8個贊

有幾個問題是安德魯·謝蘭斯基出色回答的合謀,有些人不同意并不能真正改變編譯器讀取代碼的方式

因為您的函數原型被編譯為C,所以不能使用不同的參數重載相同的函數名-這是編譯器名稱損壞的關鍵特性之一。它被描述為鏈接問題,但這并不完全正確-您將從編譯器和鏈接器中獲得錯誤。

如果您嘗試使用原型聲明的C+特性,例如重載,編譯器就會出錯。

鏈接器的錯誤將在稍后發生,因為如果您找到了鏈接器的話,您的函數似乎就找不到了。有.外“C”聲明和報頭的包裝器包含在C和C+源的混合中。

阻止人們使用將C編譯為C+設置是因為這意味著它們的源代碼不再是可移植的。該設置是一個項目設置,因此如果一個.c文件被放到另一個項目中,它將不會被編譯為c+。我希望人們花時間將文件后綴重命名為.cpp。


查看完整回答
反對 回復 2019-06-29
  • 3 回答
  • 0 關注
  • 1176 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號