目录
- 一、概念:被extern “C”修饰的代码会按照C语言的方式去编译。
- 1. 直接使用extern “C”
- 2.extern “C” { }
- 二、如果函数同时有声明和实现,要让函数声明被extern “C”修饰,函数实现可以不修饰
- 三、由于C、C++混合开发
- 1.第三方库可能是C写的。
一、概念:被extern “C”修饰的代码会按照C语言的方式去编译。
1. 直接使用extern “C”
#inlcude <iostream>using namespace std;extern "C" void func(){cout << "func()" << endl;}extern "C" void func(int arg){ cout << "func(int arg)" << endl;}int main() {return 0;}
上面的例子,如果取消extern “C”,编译不会报错,因为C++支持函数重载,加上extern “C”后按照C语言的方式编译会提示重定义。
2.extern “C” { }
extern "C" {void func(){cout << "func()" << endl;}void func(int arg){ cout << "func(int arg)" << endl;}}
二、如果函数同时有声明和实现,要让函数声明被extern “C”修饰,函数实现可以不修饰
extern "C" void func();// 或 extern "C"{ void func(); }void func(){cout << "func()" << endl;}
三、由于C、C++混合开发
1.第三方库可能是C写的。
c库
int sum(int v1, int v2) {return v1 + v2;}int delta(int v1, int v2) {return v1 - v2;}
c++无法按下面方法直接调用,会提示找不到函数
int main() {cout << sum(10, 20) << endl;cout << delta(30, 20) << endl;return 0;}
可以按照以下方式来调用
extern "C" {//只需要修饰声明int sum(int v1, int v2);int delta(int v1, int v2);}int main() {cout << sum(10, 20) << endl;cout << delta(30, 20) << endl;return 0;}
如果其他cpp文件调用c库时,又需要extern “C” {};肯定不行,
一般将extern “C” {},放到头文件声明中,但在C环境中又不识别extern “C” ;
最终通过条件编译来解决同时在c,c++中使用的问题。
Cpp文件,默认带有 #define __cplusplus
所以有最终版本,头文件中:
#ifndef __MATH_H#define __MATH_H#ifdef __cplusplusextern "C" {#endif // __cplusplusint sum(int v1, int v2);int delta(int v1, int v2);#ifdef __cplusplus}#endif // __cplusplus#endif //__MATH_H