Android源码中`__BEGIN_DECLS`和`__END_DECLS`作用
最近在阅读Android系统底层代码,发现在很多代码和库的头文件中都有 __BEGIN_DECLS
和 __END_DECLS
这两个宏。
这两个宏定义是在bionic/libc/include/sys/cdefs.h
中。(Android 9 )
1 |
从宏定义#if defined(__cplusplus)
就可以猜出来,这个处理c和c++兼容的。
extern “C”
是为了解决C++编译器在调用C语言函数时找不到C语言函数的问题。
C++由于有函数的重载,使得源文件在编译时生成的函数名不仅仅包括了函数名称,还包括了一些额外的描述符,而在编译C语言源文件时生成的函数名是没有这些额外的描述符的.这样,当C++程序引用了C的头文件,想要调用C语言函数,在链接时就会因为函数名不相等而出现找不到函数的情况,因此必须在C的头文件中使用extern “C”,来使得C++在编译时强制使用C的编译规则生成函数名。
在编写底层代码时,经常需要C
和C++
混合使用,所以这个 extern “C”
作为符号声明的一部分,是少不了的。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Jona's Blog!