Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5518018
  • 博文数量: 922
  • 博客积分: 19333
  • 博客等级: 上将
  • 技术积分: 11226
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-27 14:33
文章分类

全部博文(922)

文章存档

2023年(1)

2020年(2)

2019年(1)

2017年(1)

2016年(3)

2015年(10)

2014年(17)

2013年(49)

2012年(291)

2011年(266)

2010年(95)

2009年(54)

2008年(132)

分类: C/C++

2008-07-14 18:10:38

如果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++的函数了。

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