C调用C++代码

简介: C调用C++代码

有时C程序里需要用到C++的类,但是C语言又不能直接调用类,这时需要把C++的类使用C接口封装后,再调用,可以将封装后的C++代码编译成库文件,供C语言调用;


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


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


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

//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++接口:

//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:

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
目录
相关文章
|
5天前
|
C语言 C++ 开发者
深入探索C++:特性、代码实践及流程图解析
深入探索C++:特性、代码实践及流程图解析
|
1月前
|
自然语言处理 算法 前端开发
C++与Doxygen:精通代码文档化之道
C++与Doxygen:精通代码文档化之道
53 0
|
1月前
|
算法 安全 Java
【C/C++ 实用工具】静态代码检测工具和平台的一览
【C/C++ 实用工具】静态代码检测工具和平台的一览
22 0
|
28天前
|
IDE Java Linux
【CMake】CMake构建C++代码(一)
【CMake】CMake构建C++代码(一)
|
1月前
|
Linux 编译器 程序员
【Linux 调试秘籍】深入探索 C++:运行时获取堆栈信息和源代码行数的终极指南
【Linux 调试秘籍】深入探索 C++:运行时获取堆栈信息和源代码行数的终极指南
69 0
|
28天前
|
C++ 计算机视觉 Windows
【C++】由于找不到xxx.dll,无法继续执行代码,重新安装程序可能会解决此问题。(解决办法)
【C++】由于找不到xxx.dll,无法继续执行代码,重新安装程序可能会解决此问题。(解决办法)
|
1天前
|
编译器 C语言 C++
【C++入门学习指南】:函数重载提升代码清晰度与灵活性
【C++入门学习指南】:函数重载提升代码清晰度与灵活性
9 0
|
5天前
|
设计模式 编译器 数据安全/隐私保护
C++ 多级继承与多重继承:代码组织与灵活性的平衡
C++的多级和多重继承允许类从多个基类继承,促进代码重用和组织。优点包括代码效率和灵活性,但复杂性、菱形继承问题(导致命名冲突和歧义)以及对基类修改的脆弱性是潜在缺点。建议使用接口继承或组合来避免菱形继承。访问控制规则遵循公有、私有和受保护继承的原则。在使用这些继承形式时,需谨慎权衡优缺点。
16 1
|
6天前
|
设计模式 存储 Java
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
|
6天前
|
编译器 程序员 C++
C++从入门到精通:3.1模板编程——提高代码的复用性和灵活性
C++从入门到精通:3.1模板编程——提高代码的复用性和灵活性