首先,混合程式設計不是指在同乙個檔案裡寫c與c++。
1. extern "c"的真實目的是實現類c和c++的混合程式設計。extern 「c」是由c++提供的乙個連線交換指定符號,用於告訴c++這段**是c函式。extern 「c」後面的函式不使用的c++的名字修飾,而是用c。這是因為c++編譯後庫中函式名會變得很長,與c生成的不一致,造成c++不能直接呼叫c函式。
2.c++語言支援函式過載,c語言不支援函式過載。函式被c++編譯後在庫中的名字與c語言的不同。假設某個函式的原型為:void foo(int x, int y);該函式被c編譯器編譯後在庫中的名字為_foo,而c++編譯器則會產生像_foo_int_int之類的名字。c++提供了c連線交換指定符號extern「c」來解決名字匹配問題。
3.被extern "c"限定的函式或變數是extern型別的;extern是c/c++語言中表明函式和全域性變數作用範圍(可見性)的關鍵字,該關鍵字告訴編譯器,其宣告的函式和變數可以在本模組或其它模組中使用。被extern "c"修飾的變數和函式是按照c語言方式編譯和連線的。
4.與extern對應的關鍵字是static,被它修飾的全域性變數和函式只能在本模組中使用。因此,乙個函式或變數只可能被本模組使用時,其不可能被extern 「c」修飾。
#ifdef __cplusplus
extern "c"
#endif
_cplusplus標示符用來判斷程式是用c還是c++編譯程式編譯的。當編譯c++程式時,這個標示符會被定義,編譯c程式時,不會定義。於c++文件的標頭檔案中,上面**的意思是:如果是c++檔案(*.cpp)字尾,則使用extern 「c」,在c++專案中應用的非常廣泛。
1. cpp標頭檔案:animal.h
#ifndef __animal_h__ //防止被重複包含
#define __animal_h__
class animal;
#endif // __animal_h__
2. cpp檔案:animal.cpp
#include "animal.h"
#include
#include
using namespace std;
animal::animal(char* data)//建構函式
animal::~animal() //析構函式
}char* animal::getname(void)
3. 中間層cpp標頭檔案:middle.h
#ifndef __middle_h__
#define __middle_h__
#ifdef __cplusplus
extern "c"
#endif
#endif
注:middle.h需要包含在.c檔案中,因此middle.h中不能包含含有c++關鍵字(如class)的animal.h.
4. 中間層cpp檔案:middle.cpp
#include "middle.h"
#include "animal.h"
#include
using namespace std;
void print(void) //對外介面
注:介面函式需要用到c++中的class,因此需要包含animal.h.
5. c檔案:test.c
#include "middle.h"
int main(int argc, char *ar**)
6. makefile
main: test.o animal.o middle.o
gcc -o test middle.o animal.o test.o -lstdc++
animal.o:animal.h
g++ -c animal.cpp
middle.o:middle.h
g++ -c middle.cpp
clean:
rm -f middle.o animal.o test test.o
說明:(1) 在.c檔案中包含的直接或間接標頭檔案中不要有c++關鍵字,因為.c檔案是c編譯器編譯的,無法識別c++關鍵字。
(2) .c檔案要想使用cpp中的class,需要在乙個非成員函式中,而這個非成員函式是在cpp檔案中實現的(.c檔案不識別class)。
(3) gcc連線時需要加上-lstdc++(使用c++庫),因為缺省會使用c動態庫,而c庫中沒有c++的一些函式。
整個上述例子的關係可用圖形表示為:
綠色:必須用c++編譯,要麼是cpp檔案,要麼含有class關鍵字
藍色:c檔案
橙色:中間銜接標頭檔案(與c++無關)
注:c呼叫c++還有一種包裹函式法。
測試:應該這個比較簡單,我就不多寫了,就直接寫**。
共有三個檔案:1.h 1.c main.cpp
[root@localhost aa]#cat 1.h
#ifndef _1__h_
#define _1__h_
extern void print(char* );
#endif
[root@localhost aa]#cat 1.c
#include
#include "1.h"
void print(char* data)
printf("%s\n", data);
[root@localhost aa]#cat main.cpp
extern "c"
int main(void)
print(「hello,world\n」);
return 0;
gcc –c 1.c
g++ main.cpp 1.o
接著./a.out,又可以出現我們神奇的hello,world了,c++呼叫c**很簡單。
C C 混合程式設計
c中呼叫c c 中呼叫c都會用到extern c 但兩者的意義卻大不一樣!例 c void foo int x c c code extern c void foo int x 讓c 聯結器能通過過類似於 foo來查詢此函式,而非類似於 foo int這樣的符號。使用extern c 則是告訴編譯器...
C C 混合程式設計
分類 linux c c 2012 12 26 09 51 655人閱讀收藏 舉報cc 混合程式設計 externc cplusplus 現在,我們就來慢慢的了解吧。一 extern c 的作用 最重點 1.extern c 的真實目的是實現類c和c 的混合程式設計。extern c 是由 提供的乙...
C C 混合程式設計
現在,我們就來慢慢的了解吧。一 extern c 的作用 最重點 1.extern c 的真實目的是實現類c和c 的混合程式設計。extern c 是由 提供的乙個連線交換指定符號,用於告訴 這段 是 函式。extern c 後面的函式不使用的c 的名字修飾,而是用c。這是因為c 編譯後庫中函式名會...