C C 混合程式設計

2021-06-21 11:22:27 字數 3917 閱讀 3833

首先,混合程式設計不是指在同乙個檔案裡寫c

與c++。

混合程式設計包括:1

,c++引用c

的標頭檔案;2,

g++生成的.o與

gcc生成的

.o相鏈結。

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 *argv)

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 編譯後庫中函式名會...