第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

外部“C”在C ++中有什么影響?

外部“C”在C ++中有什么影響?

C++ C
神不在的星期二 2019-05-25 17:10:32
外部“C”在C ++中有什么影響?究竟什么extern "C"放入C ++代碼呢?例如:extern "C" {    void foo();}
查看完整描述

4 回答

?
BIG陽

TA貢獻1859條經(jīng)驗 獲得超6個贊

extern“C”使得C ++中的函數(shù)名稱具有“C”鏈接(編譯器不會破壞名稱),以便客戶端C代碼可以使用僅包含“C”兼容頭文件來鏈接(即使用)您的函數(shù)。聲明你的功能。您的函數(shù)定義包含在二進制格式(由C ++編譯器編譯)中,客戶端“C”鏈接器將使用“C”名稱鏈接到該格式。

由于C ++有函數(shù)名稱的重載而C沒有,所以C ++編譯器不能只使用函數(shù)名作為鏈接的唯一id,因此它通過添加有關(guān)參數(shù)的信息來破壞名稱。AC編譯器不需要破壞名稱,因為您不能在C中重載函數(shù)名。當(dāng)您聲明函數(shù)在C ++中具有extern“C”鏈接時,C ++編譯器不會將參數(shù)/參數(shù)類型信息添加到用于的名稱連鎖。

您知道,您可以明確指定每個單獨的聲明/定義的“C”鏈接,或使用塊將一系列聲明/定義分組以具有特定的鏈接:

extern "C" void foo(int);extern "C"{
   void g(char);
   int i;}

如果您關(guān)心技術(shù)細節(jié),它們列在C ++ 03標(biāo)準(zhǔn)的7.5節(jié)中,這里是一個簡短的摘要(重點是extern“C”):

  • extern“C”是一個鏈接規(guī)范

  • 每個編譯器都需要提供“C”鏈接

  • 鏈接規(guī)范只應(yīng)在命名空間范圍內(nèi)發(fā)生

  • 所有函數(shù)類型,函數(shù)名和變量名都有語言鏈接 請參閱Richard的注釋:只有具有外部鏈接的函數(shù)名和變量名具有語言鏈接

  • 具有不同語言鏈接的兩種函數(shù)類型是不同的類型,即使它們是相同的

  • 連接規(guī)格嵌套,內(nèi)部確定最終的連接

  • 類成員忽略extern“C”

  • 最多一個具有特定名稱的函數(shù)可以具有“C”鏈接(無論命名空間如何)

  • extern“C”強制函數(shù)具有外部鏈接(不能使其靜止) 請參閱Richard的注釋:'static'在'extern'中“C”'有效; 如此聲明的實體具有內(nèi)部鏈接,因此沒有語言鏈接

  • 從C ++到在其他語言中定義的對象以及從其他語言在C ++中定義的對象的鏈接是實現(xiàn)定義的和語言相關(guān)的。只有在兩種語言實現(xiàn)的對象布局策略足夠相似的情況下才能實現(xiàn)這種聯(lián)系


查看完整回答
反對 回復(fù) 2019-05-25
?
開滿天機

TA貢獻1786條經(jīng)驗 獲得超13個贊

只是想添加一些信息,因為我還沒有看到它發(fā)布。

您經(jīng)常會在C標(biāo)頭中看到代碼,如下所示:

#ifdef __cplusplusextern "C" {#endif// all of your legacy C code here#ifdef __cplusplus}#endif

這實現(xiàn)了它允許您將C頭文件與C ++代碼一起使用,因為將定義宏“__cplusplus”。但是你可以仍然使用舊的C代碼,其中宏使用NOT定義,所以它不會看到獨特的C ++構(gòu)建。

雖然,我也看過C ++代碼,例如:

extern "C" {#include "legacy_C_header.h"}

我想象的完成了同樣的事情。

不確定哪種方式更好,但我已經(jīng)看到了兩種方式。


查看完整回答
反對 回復(fù) 2019-05-25
?
月關(guān)寶盒

TA貢獻1772條經(jīng)驗 獲得超5個贊

在每個C ++程序中,所有非靜態(tài)函數(shù)都在二進制文件中表示為符號。這些符號是特殊文本字符串,用于唯一標(biāo)識程序中的函數(shù)。

在C中,符號名稱與函數(shù)名稱相同。這是可能的,因為在C中沒有兩個非靜態(tài)函數(shù)可以具有相同的名稱。

因為C ++允許重載并且具有C不具備的許多功能 - 比如類,成員函數(shù),異常規(guī)范 - 所以不可能簡單地使用函數(shù)名作為符號名。為了解決這個問題,C ++使用了所謂的名稱修改,它將函數(shù)名稱和所有必要信息(如參數(shù)的數(shù)量和大?。┺D(zhuǎn)換為僅由編譯器和鏈接器處理的奇怪字符串。

因此,如果您將函數(shù)指定為extern C,則編譯器不會對其執(zhí)行名稱修改,并且可以使用其符號名稱作為函數(shù)名稱直接訪問它。

這在使用dlsym()dlopen()調(diào)用此類函數(shù)時非常方便。


查看完整回答
反對 回復(fù) 2019-05-25
  • 4 回答
  • 0 關(guān)注
  • 722 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號