目录

  • 一、概念:被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