這篇文章講解的知識(shí)點(diǎn)很“小”,但是在C和C++的混合編程中非常重要。因?yàn)槲覀冊(cè)趯憫?yīng)用程序時(shí),經(jīng)常利用到第三方的程序。如果我們的代碼用C,但是第三方代碼是C++;或者我們的代碼用C++,而第三方的代碼是C,那么在整合的時(shí)候就需要仔細(xì)一點(diǎn)了。
一、C調(diào)用C++中的函數(shù)
- 被調(diào)用C++代碼中的頭文件(callee.h)
- 被調(diào)用C++代碼中的源文件(callee.cpp)
- 被調(diào)用C++代碼編譯成目標(biāo)文件(callee.o)
知識(shí)點(diǎn):
(1)關(guān)于 __cplusplus
編譯器使用g++,所有的C++編譯器中都會(huì)定義宏:__cplusplus,因此在編譯callee.h的時(shí)候,會(huì)把函數(shù)聲明包裹在extern "C" 中。
(2)關(guān)于 extern "C"
C和C++編譯器,在編譯一個(gè)函數(shù)的時(shí)候,編譯策略是不同的。C++會(huì)對(duì)函數(shù)的名稱進(jìn)行改寫(而且每個(gè)C++編譯器對(duì)于名字改寫的規(guī)則也是不一樣的,甚至同一個(gè)編譯器的不同版本的名字改寫規(guī)則也不一樣,因此,使用C++時(shí)最好用相同的編譯器版本對(duì)項(xiàng)目中的所有模塊進(jìn)行編譯。補(bǔ)充:改寫的目的是為了實(shí)現(xiàn)C++語言中的函數(shù)重載)。
在callee.h中,把函數(shù) cpp_hello 放在 extern "C" 中,意思就是告訴編譯器g++: 這個(gè)函數(shù)是需要被C調(diào)用的,請(qǐng)不要對(duì)這個(gè)函數(shù)進(jìn)行名字改寫。
可以通過 nm 指令查看一下目標(biāo)文件callee.o中的符號(hào):
我們可以多做一個(gè)測(cè)試:把extern "C"去掉之后,看一下這個(gè)函數(shù)如何被g++改寫了名字:
- 主調(diào)用C代碼中的源文件(caller.c)
- 編譯主調(diào)用C文件,得到可執(zhí)行文件
知識(shí)點(diǎn):
(1)caller.c在 include “callee.h" 時(shí),gcc編譯器中沒有定義 __cplusplus 宏,所以 callee.h 中就相當(dāng)于只有一句話:void cpp_helo();
(2)在調(diào)用 cpp_hello()函數(shù)時(shí),雖然這個(gè)函數(shù)是用g++編譯的,但是由于使用了 extern "C",所以名字沒有被編譯器g++改寫,也就是說,在callee.o目標(biāo)文件中,函數(shù)的名字就是 "cpp_hello",所以可以順利的被C代碼調(diào)用到。
二、C++調(diào)用C中的函數(shù)
- 被調(diào)用C代碼中的頭文件(callee.h)
- 被調(diào)用C代碼中的源文件(callee.c)
- 被調(diào)用C代碼編譯成目標(biāo)文件(callee.o)
知識(shí)點(diǎn):
編譯器使用gcc,其中沒有定義宏:__cplusplus,因此在編譯callee.h的時(shí)候,相當(dāng)于只有一個(gè)函數(shù)聲明。因此函數(shù)c_hello在被編譯到callee.o目標(biāo)文件中時(shí),沒有被改名。
- 主調(diào)用C++代碼源文件(caller.cpp)
- 編譯主調(diào)用C++文件,得到可執(zhí)行文件
知識(shí)點(diǎn):
g++在編譯callee.h時(shí),由于g++中定義了__cplusplus宏,因此它在調(diào)用函數(shù) c_hello時(shí),就會(huì)按照C的方式去調(diào)用(也就是沒有名字改寫),所以就能順利的在callee.o中查找到這個(gè)函數(shù)。
三、總結(jié)
- 在C++代碼的函數(shù)聲明時(shí),如果代碼會(huì)被C程序調(diào)用,一定要加上 extern "C"。
- 在C代碼的函數(shù)聲明時(shí),如果代碼會(huì)被C++程序調(diào)用,也要加上extern "C"。
- 在用C++編程時(shí),最好各模塊統(tǒng)一使用相同的編譯器,包括版本最好也相同。
-
C++
+關(guān)注
關(guān)注
22文章
2113瀏覽量
73738 -
代碼
+關(guān)注
關(guān)注
30文章
4807瀏覽量
68787 -
應(yīng)用程序
+關(guān)注
關(guān)注
37文章
3284瀏覽量
57773
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論