当前位置:   article > 正文

C调用C++代码

c调用c++代码

有时C程序里需要用到C++的类,但是C语言又不能直接调用类,这时需要把C++的类使用C接口封装后,再调用,

可以将封装后的C++代码编译成库文件,供C语言调用;

需要注意的是,封装的C++代码库文件是用g++编译的,所以在C中调用时,需要添加extern "C"{}关键字。

编译c代码时,要加上-lstdc++

 

如下代码,是c代码使用C++的map容器的例子:

  1. //test.cpp 封装C++代码
  2. #include <map>
  3. #include <iostream>
  4. #include "test.h"
  5. using namespace std;
  6. static map<int, int> m_testMap;
  7. void pushVal(int key, int val)
  8. {
  9. m_testMap[key] = val;
  10. }
  11. int getVal(int key)
  12. {
  13. map<int, int>::iterator iter = m_testMap.find(key);
  14. if (iter != m_testMap.end() )
  15. {
  16. return iter->second;
  17. }
  18. return -1;
  19. }
  20. //头文件 test.h
  21. #ifndef _TEST_H_
  22. #define _TEST_H_
  23. #ifdef __cplusplus
  24. extern "C" {
  25. #endif
  26. void pushVal(int key, int val);
  27. int getVal(int key );
  28. #ifdef __cplusplus
  29. }
  30. #endif
  31. #endif

main函数,调用封装的C++接口:

  1. //main.c
  2. #include <stdio.h>
  3. #include "test.h"
  4. int main()
  5. {
  6. printf("test\n");
  7. for (int i = 0; i < 10; i++)
  8. {
  9. printf("push key: %d, val: %d\n", i, i*10);
  10. pushVal(i, i*10);
  11. }
  12. int val = 0;
  13. for (int i = 0; i < 10; i++)
  14. {
  15. val = getVal(i);
  16. printf("get key: %d, val: %d\n", i,val);
  17. }
  18. return 0;
  19. }

编译的时候,为了简单,我这里没有编译成库文件,直接用引用.o编译的:

makefile:

  1. all:
  2. g++ -Wall -c test.cpp -o test.o
  3. gcc -Wall -c main.c -o main.o
  4. gcc -Wall test.o main.o -o test -lstdc++
  5. clean:
  6. rm test *.o

编译运行结果如下:

  1. make
  2. g++ -Wall -c test.cpp -o test.o
  3. gcc -Wall -c main.c -o main.o
  4. gcc -Wall test.o main.o -o test -lstdc++
  5. 运行:
  6. ./test
  7. test
  8. push key: 0, val: 0
  9. push key: 1, val: 10
  10. push key: 2, val: 20
  11. push key: 3, val: 30
  12. push key: 4, val: 40
  13. push key: 5, val: 50
  14. push key: 6, val: 60
  15. push key: 7, val: 70
  16. push key: 8, val: 80
  17. push key: 9, val: 90
  18. get key: 0, val: 0
  19. get key: 1, val: 10
  20. get key: 2, val: 20
  21. get key: 3, val: 30
  22. get key: 4, val: 40
  23. get key: 5, val: 50
  24. get key: 6, val: 60
  25. get key: 7, val: 70
  26. get key: 8, val: 80
  27. get key: 9, val: 90

个人微信服务号同步推送文章(微信公众号:fensnote):

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/194879
推荐阅读
相关标签
  

闽ICP备14008679号