C 和C的相互呼叫

2021-09-25 06:45:30 字數 1350 閱讀 1720

在實際的工程中,c++和c的相互呼叫時不可避免的。但是有時候用c語言的編譯器編譯成的軟體包,在c++的程式中呼叫會出現錯誤。

先看一下乙個例子:

add.c

#include "add.h"

int add

(int a, int b)

add.h

int add

(int a, int b)

;

將這兩個檔案用c語言編譯器編譯成目標檔案:

gcc add.c -o add.o

下面是乙個c++主程式

main.cpp

add.h

#include 

#include "add.h"

int main()

用c++編譯器編譯:

g++ main.cpp add.o

用c++編譯器編譯的時候,會提示錯誤,說沒喲add()這個函式。也就是說用c語言編譯的add()函式無法在c++編譯器中無法得到呼叫。

在c++中:

c++編譯器能夠相容c語言編譯方式

c++編譯器會優先使用c++的編譯方式

extern關鍵字能夠強制讓c++編譯器按c語言的編譯器編譯程式

例如將上面的主程式修改一下:

#include 

extern "c"

// 強制用c語言編譯器編譯

int main()

當編譯執行現在的**就能得到執行。

在c語言中,是不支援extern 「c」 {}這種方式的,但是我們上面那個程式如果用c語言編譯器來編譯會出錯,用c++編譯器則不會出錯,這個時候我們可以用c++編譯器內建的標準巨集定義**__cplusplus**,來讓我們的程式在c++和c語言的編譯器編譯執行都不會出錯。我們對上面的程式做一下修改:

#include 

#ifdef __cplusplus //如果是c++編譯器,則使用extern "c",如果是c語言編譯器,則直接#include "add.h"

extern "c"

#endif

int main()

用上面的擴充套件巨集定義之後就能同時在c++和c語言編譯器編譯執行了。

1、c++編譯器不能以c的方式編譯過載函式

2、編譯方式決定函式名被編譯之後的目標名

c++編譯器將函式名和引數列表編譯成函式名

c編譯器只將函式名作為目標名進行編譯

C和C 相互呼叫

c和c 相互呼叫 2011 11 01 18 42 29 分類 c c 在專案中融合c和c 有時是不可避免的,在呼叫對方的功能函式的時候,或許會出現這樣那樣的問題。近來在主程式是c語言,而呼叫c 功能函式的時候,c 的 h標頭檔案都能找到,功能函式也都定義了,最重要的是,單獨編譯c 的時候完全沒有問...

C 和C的相互呼叫

在c專案中融合c 和c的 是實際工程中不可避免的,就如一般底層的驅動是用c寫的,而應用層一般會用c c 的編譯器能相容c語言的編譯器,但他優先以c 的方式編譯 extern關鍵字強制讓c 編譯器對 進行c方式編譯注意 cplusplus 是c 編譯器都內建的乙個巨集,可以用來判斷是不是c 編譯器,那...

c和c 的相互呼叫

由於c和c 的函式符號生成的規則是不同的,符號解析 鏈結階段 的時候是不同的所以不能直接呼叫 可以在.cpp檔案中加上 extern c 如果想在.c檔案中使用.cpp檔案的函式,那麼在.cpp檔案中需要把整個函式的定義都放在extern c 中 如果我們需要寫乙個.c檔案需要呼叫.cpp檔案中的函...