目录
- [一、概念:被extern "C"修饰的代码会按照C语言的方式去编译。](#一、概念:被extern "C"修饰的代码会按照C语言的方式去编译。)
-
- [1. 直接使用extern "C"](#1. 直接使用extern "C")
- [2.extern "C" { }](#2.extern "C" { })
- [二、如果函数同时有声明和实现,要让函数声明被extern "C"修饰,函数实现可以不修饰](#二、如果函数同时有声明和实现,要让函数声明被extern "C"修饰,函数实现可以不修饰)
- 三、由于C、C++混合开发
一、概念:被extern "C"修饰的代码会按照C语言的方式去编译。
1. 直接使用extern "C"
cpp
#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" { }
cpp
extern "C" {
void func(){
cout << "func()" << endl;
}
void func(int arg){
cout << "func(int arg)" << endl;
}
}
二、如果函数同时有声明和实现,要让函数声明被extern "C"修饰,函数实现可以不修饰
cpp
extern "C" void func();
// 或 extern "C"{ void func(); }
void func(){
cout << "func()" << endl;
}
三、由于C、C++混合开发
1.第三方库可能是C写的。
c库
c
int sum(int v1, int v2) {
return v1 + v2;
}
int delta(int v1, int v2) {
return v1 - v2;
}
c++无法按下面方法直接调用,会提示找不到函数
c
int main() {
cout << sum(10, 20) << endl;
cout << delta(30, 20) << endl;
return 0;
}
可以按照以下方式来调用
cpp
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
所以有最终版本,头文件中:
cpp
#ifndef __MATH_H
#define __MATH_H
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
int sum(int v1, int v2);
int delta(int v1, int v2);
#ifdef __cplusplus
}
#endif // __cplusplus
#endif //__MATH_H