C++(c plus plus)是一种计算机高级程序设计语言,由C语言扩展升级而产生。
C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。
所以C++中嵌入C是非常容易的,通常使用extern "C"方法解决
extern "C" {
//C语言内容
}
需要分类讨论:
如果CPP不涉及到面向对象方面的东西(也就是类等等特性),其实就是一种类 C 语言的风格,这个时候,使用 “extern C” 和 “__cplusplus” 宏就可以完成 C 文件里面的代码可以直接调用 CPP 文件里面的代码
而如果涉及到了类、虚函数等等 CPP 特性的东西,单独靠 “extern C” 和 “__cplusplus” 宏是搞不定的。其原因,需要考虑到 CPP 的类,在编译的时候,编译器是怎么处理的了。而包裹函数,就是一个中间转换过程,其实是把 CPP 的面向对象,弱化到了类 C 语言风格这一个级别,或者说,是编译器进行了一次中间转换,然后 C 文件里面的代码,能够间接找到 CPP 里面类的接口了。(更深入的,就涉及到 CPP 里面相关的基础原理了)
总结一下,就是使用extern "C"和__cplusplus进行包裹/封装,最少需要三个文件:
1个.cpp,待嵌入的c++内容
1个.h是进行嵌入的部分,注意里面只能有C的定义
1个.c文件,用来调用cpp的功能
cpp文件 test.cpp
//test.cpp
#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
//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
c文件 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;
}
最后还需要编写一个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命令,运行./test.exe
就可以看到输出结果
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.exe
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
比较复杂,暂时不知道如何解决
本文章使用limfx的vscode插件快速发布