1. 程式人生 > >6. c++和c的相互呼叫

6. c++和c的相互呼叫

  • 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編譯方式只將函式名作為目標名進行編譯

應用示例

  1. 現在要寫一個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"
}