C呼叫C++程式碼

語言: CN / TW / HK

有時C程式裡需要用到C++的類,但是C語言又不能直接呼叫類,這時需要把C++的類使用C介面封裝後,再呼叫,

可以將封裝後的C++程式碼編譯成庫檔案,供C語言呼叫;

需要注意的是,封裝的C++程式碼庫檔案是用g++編譯的,所以在C中呼叫時,需要新增extern "C"{}關鍵字。

編譯c程式碼時,要加上-lstdc++

如下程式碼,是c程式碼使用C++的map容器的例子:

``` //test.cpp 封裝C++程式碼

include

include

include "test.h"

using namespace std;

static map m_testMap;

void pushVal(int key, int val) { m_testMap[key] = val; }

int getVal(int key) { map::iterator iter = m_testMap.find(key); if (iter != m_testMap.end() ) { return iter->second; }

return  -1;

}

//標頭檔案 test.h

ifndef TEST_H

define TEST_H

ifdef __cplusplus

extern "C" {

endif

void pushVal(int key, int val); int getVal(int key );

ifdef __cplusplus

}

endif

endif

```

main函式,呼叫封裝的C++介面:

``` //main.c

include

include "test.h"

int main() { printf("test\n"); for (int i = 0; i < 10; i++) { printf("push key: %d, val: %d\n", i, i10); pushVal(i, i10); }

int val = 0;
for (int i = 0; i < 10; i++)
{
    val = getVal(i);
    printf("get key: %d, val: %d\n", i,val);
}
return 0;

} ```

編譯的時候,為了簡單,我這裡沒有編譯成庫檔案,直接用引用.o編譯的:

makefile:

``` all: g++ -Wall -c test.cpp -o test.o gcc -Wall -c main.c -o main.o

gcc -Wall test.o main.o -o test -lstdc++

clean: rm test *.o ```

編譯執行結果如下:

``` make g++ -Wall -c test.cpp -o test.o gcc -Wall -c main.c -o main.o gcc -Wall test.o main.o -o test -lstdc++

執行: ./test test push key: 0, val: 0 push key: 1, val: 10 push key: 2, val: 20 push key: 3, val: 30 push key: 4, val: 40 push key: 5, val: 50 push key: 6, val: 60 push key: 7, val: 70 push key: 8, val: 80 push key: 9, val: 90 get key: 0, val: 0 get key: 1, val: 10 get key: 2, val: 20 get key: 3, val: 30 get key: 4, val: 40 get key: 5, val: 50 get key: 6, val: 60 get key: 7, val: 70 get key: 8, val: 80 get key: 9, val: 90 ```

個人微信服務號同步推送文章(微信公眾號:fensnote):