新聞中心
引用C++語(yǔ)言的頭文件需添加extern "C",但是在C語(yǔ)言中不能直接引用聲明了extern "C"的該頭文件,應(yīng)該僅將C文件中將C++中定義的extern "C"函數(shù)聲明為extern類型,希望本文能教會(huì)你更多東西。

創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、成都網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)青海,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575
實(shí)際上,在連接階段,連接器會(huì)從模塊A生成的目標(biāo)文件moduleA.obj中尋找_foo_int_int這樣的符號(hào)!加extern "C"聲明后的編譯和連接方式加extern "C"聲明后,模塊A的頭文件變?yōu)椋?/p>
- // 模塊A頭文件 moduleA.h
- #ifndef MODULE_A_H
- #define MODULE_A_H
- extern "C" int foo( int x, int y );
- #endif
在模塊B的實(shí)現(xiàn)文件中仍然調(diào)用foo( 2,3 ),其結(jié)果是:
(1)模塊A編譯生成foo的目標(biāo)代碼時(shí),沒有對(duì)其名字進(jìn)行特殊處理,引用C++語(yǔ)言的方式;
(2)連接器在為模塊B的目標(biāo)代碼尋找foo(2,3)調(diào)用時(shí),尋找的是未經(jīng)修改的符號(hào)名_foo。如果在模塊A中函數(shù)聲明了foo為extern "C"類型,而模塊B中包含的是extern int foo( int x, int y ) ,則模塊B找不到模塊A中的函數(shù);反之亦然。
所以,可以用一句話概括extern “C”這個(gè)聲明的真實(shí)目的(任何語(yǔ)言中的任何語(yǔ)法特性的誕生都不是隨意而為的,來源于真實(shí)世界的需求驅(qū)動(dòng)。我們?cè)谒伎紗栴}時(shí),不能只停留在這個(gè)語(yǔ)言是怎么做的,還要問一問它為什么要這么做,動(dòng)機(jī)是什么,這樣我們可以更深入地理解許多問題): #t#
實(shí)現(xiàn)C++與C及其它語(yǔ)言的混合編程。明白了C++中extern "C"的設(shè)立動(dòng)機(jī),我們下面來具體分析extern "C"通常的使用技巧。
.extern "C"的慣用法
(1)在C++中引用C語(yǔ)言中的函數(shù)和變量,在包含C語(yǔ)言頭文件(假設(shè)為cExample.h)時(shí),需進(jìn)行下列處理:
- extern "C"
- {
- #include "cExample.h"
- }
而在C語(yǔ)言的頭文件中,對(duì)其外部函數(shù)只能指定為extern類型,引用C++語(yǔ)言中不支持extern "C"聲明,在.c文件中包含了extern "C"時(shí)會(huì)出現(xiàn)編譯語(yǔ)法錯(cuò)誤。筆者編寫的C++引用C函數(shù)例子工程中包含的三個(gè)文件的源代碼如下:
- /* c語(yǔ)言頭文件:cExample.h */
- #ifndef C_EXAMPLE_H
- #define C_EXAMPLE_H
- extern int add(int x,int y);
- #endif
- /* c語(yǔ)言實(shí)現(xiàn)文件:cExample.c */
- #include "cExample.h"
- int add( int x, int y )
- {
- return x + y;
- }
- // c++實(shí)現(xiàn)文件,調(diào)用add:cppFile.cpp
- extern "C"
- {
- #include "cExample.h"
- }
- int main(int argc, char* argv[])
- {
- add(2,3);
- return 0;
- }
如果C++調(diào)用一個(gè)C語(yǔ)言編寫的.DLL時(shí),當(dāng)包括.DLL的頭文件或聲明接口函數(shù)時(shí),應(yīng)加extern "C" { }。(2)在C中引用C++語(yǔ)言中的函數(shù)和變量時(shí),C++的頭文件需添加extern "C",但是在C語(yǔ)言中不能直接引用聲明了extern "C"的該頭文件,應(yīng)該僅將C文件中將C++中定義的extern "C"函數(shù)聲明為extern類型。
分享標(biāo)題:在C中引用C++語(yǔ)言中的函數(shù)和變量
鏈接URL:http://m.fisionsoft.com.cn/article/coojjgj.html


咨詢
建站咨詢
