C C 混合程式設計

2021-12-30 00:06:32 字數 2866 閱讀 8564

首先,混合程式設計不是指在同乙個檔案裡寫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 編譯後庫中函式名會...