C与C++混合编程

C++中嵌入C

C++(c plus plus)是一种计算机高级程序设计语言,由C语言扩展升级而产生。

C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。

所以C++中嵌入C是非常容易的,通常使用extern "C"方法解决

extern "C" {
    //C语言内容
}

C中嵌入C++

需要分类讨论:

  1. 如果CPP不涉及到面向对象方面的东西(也就是类等等特性),其实就是一种类 C 语言的风格,这个时候,使用 “extern C” 和 “__cplusplus” 宏就可以完成 C 文件里面的代码可以直接调用 CPP 文件里面的代码

  2. 而如果涉及到了类、虚函数等等 CPP 特性的东西,单独靠 “extern C” 和 “__cplusplus” 宏是搞不定的。其原因,需要考虑到 CPP 的类,在编译的时候,编译器是怎么处理的了。而包裹函数,就是一个中间转换过程,其实是把 CPP 的面向对象,弱化到了类 C 语言风格这一个级别,或者说,是编译器进行了一次中间转换,然后 C 文件里面的代码,能够间接找到 CPP 里面类的接口了。(更深入的,就涉及到 CPP 里面相关的基础原理了)

情况1的案例

总结一下,就是使用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

情况2

比较复杂,暂时不知道如何解决


本文章使用limfx的vscode插件快速发布