最近在阅读Android系统底层代码,发现在很多代码和库的头文件中都有 __BEGIN_DECLS __END_DECLS这两个宏。

这两个宏定义是在bionic/libc/include/sys/cdefs.h中。(Android 9 )

1
2
3
4
5
6
7
#if defined(__cplusplus)
#define __BEGIN_DECLS extern "C" {
#define __END_DECLS }
#else
#define __BEGIN_DECLS
#define __END_DECLS
#endif

从宏定义#if defined(__cplusplus)就可以猜出来,这个处理c和c++兼容的。

extern “C”是为了解决C++编译器在调用C语言函数时找不到C语言函数的问题。

C++由于有函数的重载,使得源文件在编译时生成的函数名不仅仅包括了函数名称,还包括了一些额外的描述符,而在编译C语言源文件时生成的函数名是没有这些额外的描述符的.这样,当C++程序引用了C的头文件,想要调用C语言函数,在链接时就会因为函数名不相等而出现找不到函数的情况,因此必须在C的头文件中使用extern “C”,来使得C++在编译时强制使用C的编译规则生成函数名。

在编写底层代码时,经常需要CC++混合使用,所以这个 extern “C” 作为符号声明的一部分,是少不了的。