Chinaunix首页 | 论坛 | 博客
  • 博客访问: 211148
  • 博文数量: 27
  • 博客积分: 527
  • 博客等级: 中士
  • 技术积分: 262
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-07 19:52
文章分类
文章存档

2013年(6)

2012年(21)

分类: C/C++

2012-10-26 18:04:42

    Linux 中所有的系统头文件、标准 C 头文件的开头和结尾部分都会分别包含 __BEGIN_DECLS 和 __END_DECLS 两个宏。这两个宏是在 sys/cdefs.h 中定义的,系统标准头文件一般都会通过 features.h 间接包含。下面是这两个宏的定义:
/* C++ needs to know that types and declarations are C, not C++.  */
#ifdef  __cplusplus
# define __BEGIN_DECLS  extern "C" {
# define __END_DECLS    }
#else
# define __BEGIN_DECLS
# define __END_DECLS
#endif

extern "C" 是 C++ 编译器支持的一种链接指示符(linkage directive),它表示由其声明的函数使用 C 语言的方式编译和链接。

C 和 C++ 对函数编译后产生的符号名是不一样的。假设一个函数的原型为:
void foo(int x, int y);
由 C 编译器编译后产生的符号名为 _foo,而 C++ 由于支持重载的需要,编译后的符号名为 _foo_int_int 。当该函数由 extern "C" 修饰后,C++ 编译器会按 C 的规则把它编译成 _foo。

extern "C" 的用法有两种格式:
单一语句形式的链接指示符:extern "C" void foo(int, int);
复合语句形式的链接指示符:extern "C" {
                                              void foo(int, int);
                                              void bar(int, int);
                                      }

这样声明的头文件有以下特点:
1. 能同时支持 C 或 C++ 编译器。(C 编译器不支持 extern "C" 符号,所以由 __cplusplus 宏保护)
2. 头文件中声明的函数都按照 C 的方式编译和链接。
由上面两个特点可以保证使用该头文件的 C 或 C++ 程序都统一按照 C 的方式找到编译后的函数符号,而无论这个函数之前是由 C 或 C++ 编译的。

转载:http://blog.163.com/l_c_2005/blog/static/737461242011241023943/

阅读(1854) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~