(杞?C++涓璭xtern “C”鍚箟娣卞眰鎺㈢儲
1.寮曡█
銆銆C++璇█鐨勫垱寤哄垵琛鋒槸“a better C”錛屼絾鏄繖騫朵笉鎰忓懗鐫C++涓被浼糃璇█鐨勫叏灞鍙橀噺鍜屽嚱鏁版墍閲囩敤鐨勭紪璇戝拰榪炴帴鏂瑰紡涓嶤璇█瀹屽叏鐩稿悓銆備綔涓轟竴縐嶆涓嶤鍏煎鐨勮璦錛孋++淇濈暀浜嗕竴閮ㄥ垎榪囩▼寮忚璦鐨勭壒鐐癸紙琚笘浜虹О涓?#8220;涓嶅交搴曞湴闈㈠悜瀵硅薄”錛夛紝鍥犺屽畠鍙互瀹氫箟涓嶅睘浜庝換浣曠被鐨勫叏灞鍙橀噺鍜屽嚱鏁般備絾鏄紝C++姣曠珶鏄竴縐嶉潰鍚戝璞$殑紼嬪簭璁捐璇█錛屼負浜嗘敮鎸佸嚱鏁扮殑閲嶈澆錛孋++瀵瑰叏灞鍑芥暟鐨勫鐞嗘柟寮忎笌C鏈夋槑鏄劇殑涓嶅悓銆?br>銆銆2.浠庢爣鍑嗗ご鏂囦歡璇磋搗
銆銆鏌愪紒涓氭浘緇忕粰鍑哄涓嬬殑涓閬撻潰璇曢錛?/p>
銆銆闈㈣瘯棰?br>銆銆涓轟粈涔堟爣鍑嗗ご鏂囦歡閮芥湁綾諱技浠ヤ笅鐨勭粨鏋勶紵
#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus
extern "C" {
#endif
/*...*/
#ifdef __cplusplus
}
#endif
#endif /* __INCvxWorksh */
銆銆鍒嗘瀽
銆銆鏄劇劧錛屽ご鏂囦歡涓殑緙栬瘧瀹?#8220;#ifndef __INCvxWorksh銆?define __INCvxWorksh銆?endif” 鐨勪綔鐢ㄦ槸闃叉璇ュご鏂囦歡琚噸澶嶅紩鐢ㄣ?/p>
銆銆閭d箞
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
銆銆鐨勪綔鐢ㄥ張鏄粈涔堝憿錛熸垜浠皢鍦ㄤ笅鏂囦竴涓閬撴潵銆?br>
銆銆3.娣卞眰鎻瘑extern "C"
銆銆extern "C" 鍖呭惈鍙岄噸鍚箟錛屼粠瀛楅潰涓婂嵆鍙緱鍒幫細棣栧厛錛岃瀹冧慨楗扮殑鐩爣鏄?#8220;extern”鐨勶紱鍏舵錛岃瀹冧慨楗扮殑鐩爣鏄?#8220;C”鐨勩傝鎴戜滑鏉ヨ緇嗚В璇昏繖涓ら噸鍚箟銆?/p>
銆銆琚玡xtern "C"闄愬畾鐨勫嚱鏁版垨鍙橀噺鏄痚xtern綾誨瀷鐨勶紱
銆銆extern鏄疌/C++璇█涓〃鏄庡嚱鏁板拰鍏ㄥ眬鍙橀噺浣滅敤鑼冨洿錛堝彲瑙佹э級鐨勫叧閿瓧錛岃鍏抽敭瀛楀憡璇夌紪璇戝櫒錛屽叾澹版槑鐨勫嚱鏁板拰鍙橀噺鍙互鍦ㄦ湰妯″潡鎴栧叾瀹冩ā鍧椾腑浣跨敤銆傝浣忥紝涓嬪垪璇彞錛?/p>
銆銆extern int a;
銆銆浠呬粎鏄竴涓彉閲忕殑澹版槑錛屽叾騫朵笉鏄湪瀹氫箟鍙橀噺a錛屽茍鏈負a鍒嗛厤鍐呭瓨絀洪棿銆傚彉閲廰鍦ㄦ墍鏈夋ā鍧椾腑浣滀負涓縐嶅叏灞鍙橀噺鍙兘琚畾涔変竴嬈★紝鍚﹀垯浼氬嚭鐜拌繛鎺ラ敊璇?/p>
銆銆閫氬父錛屽湪妯″潡鐨勫ご鏂囦歡涓鏈ā鍧楁彁渚涚粰鍏跺畠妯″潡寮曠敤鐨勫嚱鏁板拰鍏ㄥ眬鍙橀噺浠ュ叧閿瓧extern澹版槑銆備緥濡傦紝濡傛灉妯″潡B嬈插紩鐢ㄨ妯″潡A涓畾涔夌殑鍏ㄥ眬鍙橀噺鍜屽嚱鏁版椂鍙渶鍖呭惈妯″潡A鐨勫ご鏂囦歡鍗沖彲銆傝繖鏍鳳紝妯″潡B涓皟鐢ㄦā鍧桝涓殑鍑芥暟鏃訛紝鍦ㄧ紪璇戦樁孌碉紝妯″潡B铏界劧鎵句笉鍒拌鍑芥暟錛屼絾鏄茍涓嶄細鎶ラ敊錛涘畠浼氬湪榪炴帴闃舵涓粠妯″潡A緙栬瘧鐢熸垚鐨勭洰鏍囦唬鐮佷腑鎵懼埌姝ゅ嚱鏁般?/p>
銆銆涓巈xtern瀵瑰簲鐨勫叧閿瓧鏄痵tatic錛岃瀹冧慨楗扮殑鍏ㄥ眬鍙橀噺鍜屽嚱鏁板彧鑳藉湪鏈ā鍧椾腑浣跨敤銆傚洜姝わ紝涓涓嚱鏁版垨鍙橀噺鍙彲鑳借鏈ā鍧椾嬌鐢ㄦ椂錛屽叾涓嶅彲鑳借extern “C”淇グ銆?/p>
銆銆琚玡xtern "C"淇グ鐨勫彉閲忓拰鍑芥暟鏄寜鐓璇█鏂瑰紡緙栬瘧鍜岃繛鎺ョ殑錛?/p>
銆銆鏈姞extern “C”澹版槑鏃剁殑緙栬瘧鏂瑰紡
銆銆棣栧厛鐪嬬湅C++涓綾諱技C鐨勫嚱鏁版槸鎬庢牱緙栬瘧鐨勩?/p>
銆銆浣滀負涓縐嶉潰鍚戝璞$殑璇█錛孋++鏀寔鍑芥暟閲嶈澆錛岃岃繃紼嬪紡璇█C鍒欎笉鏀寔銆傚嚱鏁拌C++緙栬瘧鍚庡湪絎﹀彿搴撲腑鐨勫悕瀛椾笌C璇█鐨勪笉鍚屻備緥濡傦紝鍋囪鏌愪釜鍑芥暟鐨勫師鍨嬩負錛?/p>
void foo( int x, int y );
銆銆璇ュ嚱鏁拌C緙栬瘧鍣ㄧ紪璇戝悗鍦ㄧ鍙峰簱涓殑鍚嶅瓧涓篲foo錛岃孋++緙栬瘧鍣ㄥ垯浼氫駭鐢熷儚_foo_int_int涔嬬被鐨勫悕瀛楋紙涓嶅悓鐨勭紪璇戝櫒鍙兘鐢熸垚鐨勫悕瀛椾笉鍚岋紝浣嗘槸閮介噰鐢ㄤ簡鐩稿悓鐨勬満鍒訛紝鐢熸垚鐨勬柊鍚嶅瓧縐頒負“mangled name”錛夈?/p>
銆銆_foo_int_int榪欐牱鐨勫悕瀛楀寘鍚簡鍑芥暟鍚嶃佸嚱鏁板弬鏁版暟閲忓強綾誨瀷淇℃伅錛孋++灝辨槸闈犺繖縐嶆満鍒舵潵瀹炵幇鍑芥暟閲嶈澆鐨勩備緥濡傦紝鍦–++涓紝鍑芥暟void foo( int x, int y )涓巚oid foo( int x, float y )緙栬瘧鐢熸垚鐨勭鍙鋒槸涓嶇浉鍚岀殑錛屽悗鑰呬負_foo_int_float銆?br>銆銆鍚屾牱鍦幫紝C++涓殑鍙橀噺闄ゆ敮鎸佸眬閮ㄥ彉閲忓錛岃繕鏀寔綾繪垚鍛樺彉閲忓拰鍏ㄥ眬鍙橀噺銆傜敤鎴鋒墍緙栧啓紼嬪簭鐨勭被鎴愬憳鍙橀噺鍙兘涓庡叏灞鍙橀噺鍚屽悕錛屾垜浠互"."鏉ュ尯鍒嗐傝屾湰璐ㄤ笂錛岀紪璇戝櫒鍦ㄨ繘琛岀紪璇戞椂錛屼笌鍑芥暟鐨勫鐞嗙浉浼鹼紝涔熶負綾諱腑鐨勫彉閲忓彇浜嗕竴涓嫭涓鏃犱簩鐨勫悕瀛楋紝榪欎釜鍚嶅瓧涓庣敤鎴風▼搴忎腑鍚屽悕鐨勫叏灞鍙橀噺鍚嶅瓧涓嶅悓銆?/p>
銆銆鏈姞extern "C"澹版槑鏃剁殑榪炴帴鏂瑰紡
銆銆鍋囪鍦–++涓紝妯″潡A鐨勫ご鏂囦歡濡備笅錛?/p>
// 妯″潡A澶存枃浠躲moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
int foo( int x, int y );
#endif
銆銆鍦ㄦā鍧桞涓紩鐢ㄨ鍑芥暟錛?/p>
// 妯″潡B瀹炵幇鏂囦歡銆moduleB.cpp
#include "moduleA.h"
foo(2,3);
銆銆瀹為檯涓婏紝鍦ㄨ繛鎺ラ樁孌碉紝榪炴帴鍣ㄤ細浠庢ā鍧桝鐢熸垚鐨勭洰鏍囨枃浠秏oduleA.obj涓鎵綺foo_int_int榪欐牱鐨勭鍙鳳紒
銆銆鍔爀xtern "C"澹版槑鍚庣殑緙栬瘧鍜岃繛鎺ユ柟寮?/p>
銆銆鍔爀xtern "C"澹版槑鍚庯紝妯″潡A鐨勫ご鏂囦歡鍙樹負錛?/p>
// 妯″潡A澶存枃浠躲moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
extern "C" int foo( int x, int y );
#endif
銆銆鍦ㄦā鍧桞鐨勫疄鐜版枃浠朵腑浠嶇劧璋冪敤foo( 2,3 )錛屽叾緇撴灉鏄細
銆銆錛?錛夋ā鍧桝緙栬瘧鐢熸垚foo鐨勭洰鏍囦唬鐮佹椂錛屾病鏈夊鍏跺悕瀛楄繘琛岀壒孌婂鐞嗭紝閲囩敤浜咰璇█鐨勬柟寮忥紱
銆銆錛?錛夎繛鎺ュ櫒鍦ㄤ負妯″潡B鐨勭洰鏍囦唬鐮佸鎵緁oo(2,3)璋冪敤鏃訛紝瀵繪壘鐨勬槸鏈粡淇敼鐨勭鍙峰悕_foo銆?/p>
銆銆濡傛灉鍦ㄦā鍧桝涓嚱鏁板0鏄庝簡foo涓篹xtern "C"綾誨瀷錛岃屾ā鍧桞涓寘鍚殑鏄痚xtern int foo( int x, int y ) 錛屽垯妯″潡B鎵句笉鍒版ā鍧桝涓殑鍑芥暟錛涘弽涔嬩害鐒躲?/p>
銆銆鎵浠ワ紝鍙互鐢ㄤ竴鍙ヨ瘽姒傛嫭extern “C”榪欎釜澹版槑鐨勭湡瀹炵洰鐨勶紙浠諱綍璇█涓殑浠諱綍璇硶鐗規х殑璇炵敓閮戒笉鏄殢鎰忚屼負鐨勶紝鏉ユ簮浜庣湡瀹炰笘鐣岀殑闇姹傞┍鍔ㄣ傛垜浠湪鎬濊冮棶棰樻椂錛屼笉鑳藉彧鍋滅暀鍦ㄨ繖涓璦鏄庝箞鍋氱殑錛岃繕瑕侀棶涓闂畠涓轟粈涔堣榪欎箞鍋氾紝鍔ㄦ満鏄粈涔堬紝榪欐牱鎴戜滑鍙互鏇存繁鍏ュ湴鐞嗚В璁稿闂錛夛細
銆銆瀹炵幇C++涓嶤鍙婂叾瀹冭璦鐨勬販鍚堢紪紼嬨?br>銆銆鏄庣櫧浜咰++涓璭xtern "C"鐨勮绔嬪姩鏈猴紝鎴戜滑涓嬮潰鏉ュ叿浣撳垎鏋恊xtern "C"閫氬父鐨勪嬌鐢ㄦ妧宸с?br>銆銆4.extern "C"鐨勬儻鐢ㄦ硶
銆銆錛?錛夊湪C++涓紩鐢–璇█涓殑鍑芥暟鍜屽彉閲忥紝鍦ㄥ寘鍚獵璇█澶存枃浠訛紙鍋囪涓篶Example.h錛夋椂錛岄渶榪涜涓嬪垪澶勭悊錛?/p>
extern "C"
{
#include "cExample.h"
}
銆銆鑰屽湪C璇█鐨勫ご鏂囦歡涓紝瀵瑰叾澶栭儴鍑芥暟鍙兘鎸囧畾涓篹xtern綾誨瀷錛孋璇█涓笉鏀寔extern "C"澹版槑錛屽湪.c鏂囦歡涓寘鍚簡extern "C"鏃朵細鍑虹幇緙栬瘧璇硶閿欒銆?/p>
銆銆絎旇呯紪鍐欑殑C++寮曠敤C鍑芥暟渚嬪瓙宸ョ▼涓寘鍚殑涓変釜鏂囦歡鐨勬簮浠g爜濡備笅錛?/p>
/* c璇█澶存枃浠訛細cExample.h */
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
extern int add(int x,int y);
#endif
/* c璇█瀹炵幇鏂囦歡錛歝Example.c */
#include "cExample.h"
int add( int x, int y )
{
return x + y;
}
// c++瀹炵幇鏂囦歡錛岃皟鐢╝dd錛歝ppFile.cpp
extern "C"
{
#include "cExample.h"
}
int main(int argc, char* argv[])
{
add(2,3);
return 0;
}
銆銆濡傛灉C++璋冪敤涓涓狢璇█緙栧啓鐨?DLL鏃訛紝褰撳寘鎷?DLL鐨勫ご鏂囦歡鎴栧0鏄庢帴鍙e嚱鏁版椂錛屽簲鍔爀xtern "C" {銆}銆?/p>
銆銆錛?錛夊湪C涓紩鐢–++璇█涓殑鍑芥暟鍜屽彉閲忔椂錛孋++鐨勫ご鏂囦歡闇娣誨姞extern "C"錛屼絾鏄湪C璇█涓笉鑳界洿鎺ュ紩鐢ㄥ0鏄庝簡extern "C"鐨勮澶存枃浠訛紝搴旇浠呭皢C鏂囦歡涓皢C++涓畾涔夌殑extern "C"鍑芥暟澹版槑涓篹xtern綾誨瀷銆?br>銆銆絎旇呯紪鍐欑殑C寮曠敤C++鍑芥暟渚嬪瓙宸ョ▼涓寘鍚殑涓変釜鏂囦歡鐨勬簮浠g爜濡備笅錛?/p>
//C++澶存枃浠?cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x, int y );
#endif
//C++瀹炵幇鏂囦歡 cppExample.cpp
#include "cppExample.h"
int add( int x, int y )
{
return x + y;
}
/* C瀹炵幇鏂囦歡 cFile.c
/* 榪欐牱浼氱紪璇戝嚭閿欙細#include "cExample.h" */
extern int add( int x, int y );
int main( int argc, char* argv[] )
{
add( 2, 3 );
return 0;
}
銆銆濡傛灉娣卞叆鐞嗚В浜嗙3鑺備腑鎵闃愯堪鐨別xtern "C"鍦ㄧ紪璇戝拰榪炴帴闃舵鍙戞尌鐨勪綔鐢紝灝辮兘鐪熸鐞嗚В鏈妭鎵闃愯堪鐨勪粠C++寮曠敤C鍑芥暟鍜孋寮曠敤C++鍑芥暟鐨勬儻鐢ㄦ硶銆傚絎?鑺傜粰鍑虹殑紺轟緥浠g爜錛岄渶瑕佺壒鍒暀鎰忓悇涓粏鑺傘?nbsp;