有时C程序里需要用到C++的类,但是C语言又不能直接调用类,这时需要把C++的类使用C接口封装后,再调用,
可以将封装后的C++代码编译成库文件,供C语言调用;
需要注意的是,封装的C++代码库文件是用g++编译的,所以在C中调用时,需要添加extern "C"{}关键字。
编译c代码时,要加上-lstdc++
如下代码,是c代码使用C++的map容器的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
//test.cpp 封装C++代码 #include <map> #include <iostream> #include "test.h" using namespace std; static map< int , int > m_testMap; void pushVal( int key, int val) { m_testMap[key] = val; } int getVal( int key) { map< int , int >::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++接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
//main.c #include <stdio.h> #include "test.h" int main() { printf ( "test\n" ); for ( int i = 0; i < 10; i++) { printf ( "push key: %d, val: %d\n" , i, i*10); pushVal(i, i*10); } 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:
1
2
3
4
5
6
7
8
|
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 |
编译运行结果如下:
1
2
3
4
|
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
到此这篇关于C调用C++代码的方法步骤的文章就介绍到这了,更多相关C调用C++内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://juejin.cn/post/7012179061959032868