1. C++调用C
- 可以认为C++向下兼容C,C的语法在C++中基本都可以使用,所以在C++中调用C相对较简单。
区别在于,由于C++的功能特性,编译时对C函数和C++函数的处理不同,导致不能直接调用,否者会出现找不到函数的问题。
解决方法也很简单,那就是显式的指定以C的格式去调用函数。
示例如下:
如上述示例,分为"test.c" void cpp_call_c_test(int a) { printf("cpp_call_c_test:%d\n", a); } "test.h" #ifdef __cplusplus extern "C"{ #endif void cpp_call_c_test(int a); #ifdef __cplusplus } #endif "main.cpp" #include "test.h" int main() { cpp_call_c_test(1); return 0; }
test.c
,test.h
,main.cpp
三个文件,只需要在test.h
中声明函数时,用extern "C"{
和}
将要被C++调用的函数括起来。然后在C++中就可以调用了。
- C调用C++根据情况的不同,可能会相对麻烦一些。
如果是调用非成员函数,参数也没什么特殊,那么加上
extern "C"{
和}
声明后,也就可以直接调用了,如果是成员函数,或者函数参数中存在类等C不支持的类型,又或者是重载函数之类的,那么就需要再封装一层,将函数转换成C支持的函数样式就好了。示例如下:
如上述示例,只是表示了最简单的C调用C++非成员函数的示例,其它一些不能直接调用的类型,也可以通过再封装一层转换成非成员函数然后进行调用。"test.cpp" void c_call_cpp_test(int a) { std::cout << "c_call_cpp_test:" << a << std::endl; } "test.h" #ifdef __cplusplus extern "C" { #endif void c_call_cpp_test(int a); #ifdef __cplusplus } #endif "main.c" #include "test.h" int main() { c_call_cpp_test(1); return 0; }
包括像想要调用一些C++写的第三方程序或库,其提供的头文件中往往包含着各种类的定义和一些C++才有的数据类型,这时就无法直接在原头文件中用
extern "C"{
和}
对想要调用的函数进行声明然后在C中包含这个头文件,因为在C中是不支持类这种东西的,包含后编译时会报错,解决方法也是再封装一层,避免出现一些C不支持的东西。
- 没有什么问题是封装一层不能解决的,如果有,那就再封一层。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)