extern C - ShenYj/ShenYj.github.io GitHub Wiki
被 extern "C"
修饰的代码会按照C语言的方式去编译
-
示例代码
extern "C" void func() { }
或者用大括号包裹的方式
extern "C" { void func() { } void funa(int v) { } } extern "C" { void func(); void funa(int v); } extern "C" { #include "math.h" }
如果函数同时有声明和实现, 要让函数声明被 extern "C"
修饰, 函数实现可以不修饰
-
示例代码
extern "C" void func(); void func() { }
两个地方都加
extern "C"
也是可以的
由于 C 、C++ 编译规则的不同,在 C 、C++ 混合开发时, 可能会经常出现以下操作
-
在 C++ 代码中引用 C 语言函数, 默认会按照 C++ (name mangling)编译后函数名的规则去查找,找不到
C
中提供的函数,需要告诉编译器按照 C 语言的方式去编译查找函数 -
更严谨和方便的方式是在编写C语言函数时,直接将函数声明增加
extern "C"
修饰, 这样混合开发时,别人在使用的时候不需要额外修饰处理, 通过宏定义区分环境#ifdef __cplusplus extern "C" { #endif // __cplusplus int sum(int v1, int v2); int delta(int v1, int v2); int divide(int v1, int v2); #ifdef __cplusplus } #endif // __cplusplus
-
防止重复包含
include
, 为了防止重复包含, 通过ifndef
来进行判断#ifndef __MATH_H #define __MATH_H #ifdef __cplusplus extern "C" { #endif // __cplusplus int sum(int v1, int v2); int delta(int v1, int v2); int divide(int v1, int v2); #ifdef __cplusplus } #endif // __cplusplus #endif // !__MATH_H
保证每个头文件中的宏唯一, 通常使用文件名来定义宏, 并以两个下划线开头,区别于普通的宏