关于 extern "C" 的问题

转载 2007年09月16日 15:51:00
   extern   "C"  
  多用在用非C的语言写的程序意欲调用用C写成的库。用c写成的库里的函数名(肯定是由C编译器编译的)都是C的风格——也就是简单的一个函数名。比如函数void   st_read(ft_t   f)在库里的符号名就是st_read。  
   
  那么在你的程序中(假设是C++写成的)需要用到这个st_read函数,当然首先要声明这个函数,让编译器知道存在st_read这个符号名。这时,在声明这个函数时,就需要用extern   "C",即:  
  extern   "C"   void   st_read(ft_t   f)  
  或者  
  extern   "C"  
  {  
  void   st_read(ft_t   f)  
  }  
   
  如果不这样做在编译时,C++编译器就会把这个函数名编译成void_st_read_ft_txxx这样一个乱七八糟的形式(实际情况有出入),这主要 是C++为了重载而对同名函数做的区分。用这个乱七八糟的名字当然无法引用C库中的对应函数(上面已说了C库中的该函数符号名为简单的st_read)。  
   
   
  另外一个相反的情况就是你用其他非C语言写成了库,你想要C程序能够调用你的库中的函数,那么需要将那些需要导出的函数的声明用extern   "C"修饰。这需要非C编译器支持extern   "C"修饰。 

  如果不这样做在编译时,C++编译器就会把这个函数名编译成void_st_read_ft_txxx这样一个乱七八糟的形式(实际情况有出入),这主要 是C++为了重载而对同名函数做的区分。用这个乱七八糟的名字当然无法引用C库中的对应函数(上面已说了C库中的该函数符号名为简单的st_read)。


  林锐的高质量C/C++编程有讲道,一下是我摘录的:  
   
  如果同名函数仅仅是返回值类型不同,有时可以区分,有时却不能.例如:    
  void   Function(void);    
  int   Function   (void);    
  上述两个函数,第一个没有返回值,第二个的返回值是int类型.如果这样调用函数:    
  int   x   =   Function   ();    
  则可以判断出Function是第二个函数.问题是在C++/C程序中,我们可以忽略函数的  
  返回值.在这种情况下,编译器和程序员都不知道哪个Function函数被调用.    
  所以只能靠参数而不能靠返回值类型的不同来区分重载函数.编译器根据参数为每  
  个重载函数产生不同的内部标识符.例如编译器为示例8-1-1中的三个Eat函数产生象  
  _eat_beef,_eat_fish,_eat_chicken之类的内部标识符(不同的编译器可能产生不同  
  风格的内部标识符).    
  如果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   直接引用这些头文件.    
  注意并不是两个函数的名字相同就能构成重载.全局函数和类的成员函数同名不算  
  重载,因为函数的作用域不同.例如:    
  void   Print(…);   //   全局函数    
  class   A    
  {…    
  void   Print(…);   //   成员函数    
  高质量C++/C   编程指南,v   1.0    
  2001   Page   59   of   101  
  }    
  不论两个Print函数的参数是否不同,如果类的某个成员函数要调用全局函数  
  Print,为了与成员函数Print区别,全局函数被调用时应加'::'标志.如    
  ::Print(…);   //   表示Print是全局函数而非成员函数    
  

相关文章推荐

extern "C"的问题研究

为什么要使用extern “C”呢?C++之父在设计C++时,考虑到当时已经存在了大量的C代码,为了支持原来的C代码和已经写好的C库,需要在C++中尽可能的支持C,而extern “C”就是其中的一个...

C程序问题归纳(static,auto,register,extern,程序内存分布图,linux下程序的执行过程......)(一)

#PS:请尊重原创,不喜勿喷 #PS:要转载请注明出处,本人版权所有 #PS:这个只是  《  我自己    》理解,如果和你的原则相冲突,请 谅解,勿喷  ...

extern "c" 动态链接库符号表导出问题 以及函数参数压栈顺序

c语言编译的动态链接库中,导出的符号名字就是 源代码中的相应的名字; 例如函数 void test(){} 导出的符号名字 就是 test 但是对于c++ 来讲不是这样, c++ 有类, ...

extern "C"两个实例,帮你解决小问题。

网上有很多介绍extern "C"的文章,都很不错,可是我在对其中c文件引用cpp函数,cpp文件引用c函数,又涉及到重载的时候,还是有点小迷糊,只好自己弄几个实例,一目了然。 这里需要注意: 1...

关于“#ifdef __cplusplus” 和 " extern "C" 的问题

解释一   时常在cpp的代码之中看到这样的代码: #ifdef __cplusplus extern "C" { #endif //一段代码 #ifdef __cplusplus }...

extern “C”{}的含义及解决的问题

C与C++程序连接问题  它们之间的连接问题主要是因为c c++编绎器对函数名译码的方式不能所引起的,考虑下面两个函数  /* c*/  int strlen(char* string)  {...

c和c++混合编译的问题(extern "C")

c和c++混合编译的问题(extern "C") 2008-10-21 14:51 480人阅读 评论(0) 收藏 举报  1.引言    C++语言的创建初衷是“a bette...

c/c++混编到的问题 extern "C" 介绍【转】

c与c++连接发现出现了找不到具体函数的错误:以下是假设旧的C程序库C的头文件/———–c.h————–/#ifndef _C_H_ #define _C_H_ extern int add(int ...

extern C详细解释

  • 2007-09-03 16:28
  • 56KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)