C++程序不能直接調用已編譯後的C函數的,這是因爲名稱問題,舉個例,一個函數叫做void foo(int x, int y),該函數被C編譯器編譯後在庫中的名字爲_foo,而C++編譯器則會產生像_foo_int_int之類的名字用來支持函數重載和類型安全連接,名稱就不一樣,因此不能直接調用的。那要調用的話怎麼辦呢? C++提供了一個C連接交換指定符號***extern“C”***來解決這個問題。
extern “C”
{
void foo(int x, int y);
…// 其它函數
}
extern “C”
{
#include “myheader.h”
…// 其它C頭文件
}
這就告訴C++編譯譯器,函數foo 是個C連接,應該到庫中找名字_foo而不是找_foo_int_int。
//test.h
#ifdef __cplusplus
#include <iostream>
using namespace std;
extern "C"
{
#endif
void mytest();
#ifdef __cplusplus
}
#endif
可以將mytest()的實現放在.c或者.cpp文件中,可以在.c或者.cpp文件中include "test.h"後使用頭文件裏面的函數,而不會出現編譯錯誤。