在實際的工程中,c++和c的相互呼叫時不可避免的。但是有時候用c語言的編譯器編譯成的軟體包,在c++的程式中呼叫會出現錯誤。
先看一下乙個例子:
add.c
add.h#include "add.h"
int add
(int a, int b)
將這兩個檔案用c語言編譯器編譯成目標檔案:int add
(int a, int b)
;
gcc add.c -o add.o
下面是乙個c++主程式
main.cpp
add.h
用c++編譯器編譯:#include
#include "add.h"
int main()
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語言的編譯器編譯執行都不會出錯。我們對上面的程式做一下修改:
用上面的擴充套件巨集定義之後就能同時在c++和c語言編譯器編譯執行了。#include
#ifdef __cplusplus //如果是c++編譯器,則使用extern "c",如果是c語言編譯器,則直接#include "add.h"
extern "c"
#endif
int main()
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檔案中的函...