6. c++和c的相互呼叫
阿新 • • 發佈:2019-01-23
- c++ 編譯器能夠相容C語言的編譯方式
- c++ 編譯器會優先使用c++編譯的方式
- extern關鍵字會強制讓c++編譯器進行c方式的編譯
extern "C"
{
#include "c.h" //c方式編譯出來的c.c 呼叫c.c中的f();
}
int main(void)
{
f();
return 0;
}
- 為了保證一段c程式碼只會以c的方式編譯(上面程式碼c編譯器無法通過)
- __cplusplus是c++編譯器內建的標準巨集定義
- __cplusplus的意義
- 確保c程式碼以統一的c方式被編譯成目標檔案
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
#include "add.h"
#ifdef __cplusplus
}
#endif
int main()
{
int c = add(1, 2);
printf("c = %d\n", c);
return 0;
}
注意
- c++編譯器不能以c的方式編譯過載函式
- 編譯方式決定函式名被編譯後的目標名
- c++編譯方式將函式名和引數列表編譯成目標名
- c編譯方式只將函式名作為目標名進行編譯
應用示例
- 現在要寫一個c語言的模組,供以後使用(以後的專案可能是c的也可能是c++的),原始檔事先編譯好,編譯成.so或.o都無所謂。標頭檔案中宣告函式時要用條件編譯包含起來,如下:
#ifdef __cplusplus
extern "C" {
#endif
//some code
#ifdef __cplusplus
}
#endif
也就是把所有函式宣告放在some code的位置。
2. 如果這個模組已經存在了,可能是公司裡的前輩寫的,反正就是已經存在了,模組的.h檔案中沒有extern “C”關鍵字,這個模組又不希望被改動的情況下,可以這樣,在你的c++檔案中,包含該模組的標頭檔案時加上extern “C”, 如下:
extern "C" {
#include "test_extern_c.h"
}