当前位置:   article > 正文

C调用C++代码_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
  • 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
  • 48

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

编译的时候,为了简单,我这里没有编译成库文件,直接用引用.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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

编译运行结果如下:

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

闽ICP备14008679号