在C語言中,編譯器對於函數 int test()和int test(int a)的編譯結果得到的函數名是一樣的,所以C語言不能重載
而在C++中int test()和int test(int a)編譯后生成不同名字的函數,所以支持重載
1.這就產生了問題,如果在C++中調用C語言的int test(int a)函數,會連接錯誤,因為編譯后找不到對應名稱的函數(c和cpp生成的函數名不同)
所以需要在CPP文件中如果要使用int test(int a)函數,需要在(include下面)用extern "C" int test(int a)
如果調用的C函數特別多,也可以用下面的方式聲明
extern "C"
{
需要調用的c語言函數
int test(int a);
}
或者
extern "C"
{
#include "XXX.h"
這樣會把XXX.h里面聲明的函數都變成C函數生成規則
}
2.如果要在.c文件中需要調用CPP函數需要在.cpp文件中用extern "C"{
cpp函數的實現
}
然后系統在編譯這個函數的時候就會自動按照C語言的規則進行編譯
3.如果要寫一套函數庫,同時提供給C和CPP使用,那必須用C語言規則進行編譯
如果是寫在CPP文件中的,必須要加extern "C"聲明
--1.在cpp文件中加上extern,讓函數編譯是用c規則編譯
--2.在調用者的cpp文件中用extern "C"{include 引入頭文件}
4.但是3的實現比較麻煩,只要調用通用函數就得在調用者的cpp文件中用extern引入頭文件
解決方法:在通用函數的.h和.cpp文件中,都用extern來聲明--(但是此時就會讓c調用不了通用函數,因為c里面沒有extern,c包含的頭文件包含extern,所以編譯通不過)
所以要在通用函數的.h文件里面用
#ifdef __cplusplus
extern "C" {
#endif
int sum(int, int);
#ifdef __cplusplus
}
#endif
因為cpp在編譯時會自動生成__cplusplus這個宏,所以利用這一點,可以實現c文件中不包含extern
cpp中包含extern