C 與 C 混合程式設計

2021-09-01 19:31:23 字數 2499 閱讀 3696

2 c 呼叫 c++ 庫

3 關於 extern 「c」

c++ 是 c 的超集,由於 c++ 具有函式過載等語法特性,使得編譯器在進行 c++ 編譯時與 c 的編譯規則上有所不同。比如為了支援過載,編譯器編譯c++程式時要對函式名進行「重新命名」,新增字尾的方式(字尾由引數的簡寫構成)以區別過載的函式。而編譯器在編譯 c 程式時,函式名不會改動。正是由於在函式名的「翻譯規則」的不同導致 c++ 程式不能直接呼叫 c 編譯生成的庫檔案,否則,會出現「undefined reference」。

c++ 呼叫 c 庫比較簡單,按照如下方法:

檔案結構:

將addint.c, addfloat.c封裝成庫,在main.cpp中呼叫

main.cpp:

#include

#include

extern

"c"class test

test

(int a,

int b,

float c,

float d)

~test()

};intmain()

makefile:

main:

gcc -fpic -c addint.c

gcc -fpic -c addfloat.c

ar -rcs libadd.a addint.o addfloat.o

gcc -shared -fpic -olibadd.so addint.o addfloat.o

g++ main.cpp -omain -ladd -l.

.phony: clean

clean:

rm -rf *.o *.so *.a main

c 呼叫 c++ 庫比較麻煩,必須編寫乙個介面檔案。

具體方法:

介面檔案格式:

#include

"addclass.h"

#ifdef __cplusplus

extern

"c"#ifdef __cplusplus

}#endif

檔案結構:

main.c:

/***************main.c********************/

#include

extern

intaddint

(int

,int);

intmain

(int argc,

char

** argv)

cpp2c.cpp:

/*****************cpp2c.cpp***************/

#include

"addclass.h"

#ifdef __cplusplus

extern

"c"#ifdef __cplusplus

}#endif

addclass.h:

/******************addclass.h***************/

#ifndef __add_h__

#define __add_h__

class add

;#endif

addclass.cpp:

/******************addclass.cpp*************/

#include

"addclass.h"

add:

:add

(int a,

int b)

add::~

add(

)int add:

:getsum()

makefile:

cflags=-imy_lib/include -iinclude -fpic

main:

g++ $(cflags) -c my_lib/src/addclass.cpp

g++ $(cflags) -c src/cpp2c.cpp

gcc $(cflags) -c src/main.c

ar -rcs libadd.a addclass.o cpp2c.o

gcc $(cflags) -shared -olibadd.so addclass.o cpp2c.o

gcc $(cflags) main.o -o$@ -ladd -lstdc++ -l.

.phony:clean

clean:

rm -rf *.o *.a *.so main

extern 「c」 作用:一般出現在 cpp 檔案中,並使用g++編譯。告訴g++編譯器其中宣告的函式和變數採用c的編譯規則進行編譯。

extern 詳細解釋參考:

c與c 混合程式設計

在純c的系統中使用c 的類出現了編譯錯誤!程式 begin mymain.c include thesocket.h void main int argc,char argv end mymain.c begin thesocket.h class thesocket end thesocket.h...

c與c 混合程式設計

1.引言 c 語言的建立初衷是 a better c 但是這並不意味著c 中類似 c語言的全域性 變數和函式所採用的編譯和連線方式與c語言完全相同。作為一種欲與c相容的語言,c 保留了一部分過程式語言的特點 被世人稱為 不徹底地物件導向 因而它可以定義不屬於任何類的全域性變數和函式。但是,c 畢竟是...

C與C 混合程式設計

c 是在 c 語言的基礎上發展起來的。在某種程度上,我們可將 c 看做 c 的一種擴充套件。在本質上,二者的資料型別和函式呼叫慣例都是一致的,因此 c 與 c 混合編譯也是很自然的事情。二者的區別僅在於編譯後函式的名字不同 c 簡單地使用函式名而不考慮引數的個數或型別,而 c 編譯後的函式名則總是將...