关于extern

1636阅读 0评论2008-07-14 vaqeteart
分类:C/C++

如果C++程序要调用已经被编译后的C   函数  
   
  假设某个C   函数的声明如下:  
  void   foo(int   x,   int   y);  
  该函数被C   编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int  
  之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能  
  直接调用C   函数。C++提供了一个C   连接交换指定符号extern“C”来解决这个问题。  
  例如:  
  extern   “C”  
  {  
  void   foo(int   x,   int   y);  
  ⋯   //   其它函数  
  }  
  或者写成  
  extern   “C”  
  {  
  #include   “myheader.h”  
  ⋯   //   其它C   头文件  
  }  
  这就告诉C++编译译器,函数foo   是个C   连接,应该到库中找名字_foo   而不是找  
  _foo_int_int。C++编译器开发商已经对C   标准库的头文件作了extern“C”处理,所以  
  我们可以用#include   直接引用这些头文件。
 
**********************************

为什么标准头文件都有类似以下的结构?

#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus

extern "C" {
#endif
/*...*/
#ifdef __cplusplus
}

#endif
#endif /* __INCvxWorksh */

  解答:

  头文件中的编译宏

#ifndef __INCvxWorksh
#define
 __INCvxWorksh
#endif

  的作用是防止被重复引用。

  作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在symbol库中的名字与C语言的不同。例如,假设某个函数的原型为:

void foo(int x, int y);

  该函数被C编译器编译后在symbol库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。_foo_int_int这样的名字包含了函数名和函数参数数量及类型信息,C++就是考这种机制来实现函数重载的。

  为了实现CC++的混合编程,C++提供了C连接交换指定符号extern "C"来解决名字匹配问题,函数声明前加上extern "C"后,则编译器就会按照C语言的方式将该函数编译为_foo,这样C语言中就可以调用C++的函数了。

**********************************
上一篇:word有时候自动把英文字母大写,怎么办?
下一篇:智力题答案