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