鏈接指示符 extern "C"
程序員用鏈接指示符[linkage directive] 告訴編譯器 該函數是用其他的程序設計語言編寫的
// 單一語句形式的鏈接指示符
extern "C" void exit(int);
// 複合語句形式的鏈接指示符
extern "C" {
int printf( const char* ... );
int scanf( const char* ... );
}
// 複合語句形式的鏈接指示符
extern "C" {
#include <cmath>
}
鏈接指示符不能出現在函數體中 下列代碼段將會導致編譯錯誤
int main()
{
// 錯誤 :鏈接指示符不能出現在函數內
extern "C" double sqrt( double );
double getValue(); //ok
double result = sqrt ( getValue() );
//...
return 0;
}
如果把鏈接指示符移到函數體外 程序編譯將無錯誤
extern "C" double sqrt( double );
int main()
{
double getValue(); //ok
double result = sqrt ( getValue() );
//...
return 0;
}
例如
// 函數 calc() 可以被 C程序調用
extern "C" double calc( double dparm ) { /* ... */ }
============外鏈補充==============from http://blog.chinaunix.net/uid-24118190-id-2985318.html
用主程序的C調用C++的功能函數時總是提示該函數未定義(undefined)。這是什麼問題?如何解決?
關鍵點在這裏:我們就靠在C++的*.h和*.cpp的頭尾加入下面代碼才得以解決問題。
#ifdef __cplusplus
extern "C" {
#endif
//一段代碼
#ifdef __cplusplus
}
#endif
其中 __cplusplus是cpp中的自定義宏。上面的代碼的含義是:如果這是一段cpp的代碼,那麼加入extern "C"{和}處理其中的代碼。要明白爲何使用extern "C",還得從cpp中對函數的重載處理開始說起。在c++中,爲了支持重載機制,在編譯生成的彙編碼中,要對函數的名字進行一些處理,加入比如函數的返回類型等等.而在C中,只是簡單的函數名字而已,不會加入其他的信息.也就是說:C++和C對產生的函數名字的處理是不一樣的. 加入 extern "C" 聲明的目的是解決C與C++的相互調用的問題。
=========================