extern "C"的问题研究

原创 2015年07月09日 20:16:06

为什么要使用extern “C”呢?C++之父在设计C++时,考虑到当时已经存在了大量的C代码,为了支持原来的C代码和已经写好的C库,需要在C++中尽可能的支持C,而extern “C”就是其中的一个策略。在声明函数时,注意到我也使用了extern “C”,这里要详细的说说extern “C”。

extern “C”包含两层含义,首先是它修饰的目标是”extern”的;其次,被它修饰的目标才是”C”的。先来说说extern;在C/C++中,extern用来表明函数和变量作用范围(可见性)的关键字,这个关键字告诉编译器,它申明的函数和变量可以在本模块或其它模块中使用。extern的作用总结起来就是以下几点:

  1. 在一个文件内,如果外部变量不在文件的开头定义,其有效范围只限定在从定义开始到文件的结束处。如果在定义前需要引用该变量,则要在引用之前用关键字”extern”对该变量做”外部变量声明”,表示该变量是一个已经定义的外部变量。有了这个声明,就可以从声明处起合理地使用该变量了,例如:
    /*
    ** FileName     : Extern Demo
    ** Author       : Jelly Young
    ** Date         : 2013/11/18
    ** Description  : More information, please go to http://www.jellythink.com
    */
    #include <iostream>
    using namespace std;
    int main(int argc, char *argv[])
    {
          extern int a;
          cout<<a<<endl;
    }
    int a = 100;
  2. 在多文件的程序中,如果多个文件都要使用同一个外部变量,不能在各个文件中各定义一个外部变量,否则会出现“重复定义”的错误。正确的做法是在任意一个文件中定义外部变量,其它文件用extern对变量做“外部变量声明”。在编译和链接时,系统会知道该变量是一个已经在别处定义的外部变量,并把另一文件中外部变量的作用域扩展到本文件,这样在本文件就可以合法地使用该外部变量了。写过MFC程序的人都知道,在在CXXXApp类的头文件中,就使用extern声明了一个该类的变量,而该变量的实际定义是在CXXXApp类的实现文件中完成的;
  3. 外部函数,在定义函数时,如果在最左端加关键字extern,表示此函数是外部函数。C语言规定,如果在定义时省略extern,则隐含为外部函数。而内部函数必须在前面加static关键字。在需要调用此函数的文件中,用extern对函数作声明,表明该函数是在其它文件中定义的外部函数。
接着说”C”的含义。我们都知道C++通过函数参数的不同类型支持重载机制,编译器根据参数为每个重载函数产生不同的内部标识符;但是,如果遇到了C++程序要调用已经被编译后的C函数,那该怎么办呢?比如上面的int Add ( int a , int b )函数。该函数被C编译器后在库中的名字为_Add,而C++编译器则会生成像_Add_int_int之类的名字用来支持函数重载和类型安全。由于编译后的名字不同,C++程序不能直接调用C函数,所以C++提供了一个C连接交换指定符号extern “C”来解决这个问题;所以,在上面的DLL中,Add函数的声明格式为:extern “C” EXPORTS_DEMO int Add (int a , int b)。这样就告诉了C++编译器,函数Add是个C连接的函数,应该到库中找名字_Add,而不是找_Add_int_int

如何将64位操作系统下VS2012程序部署在x86平台

如何将64位操作系统下VS2012程序部署在x86平台 前段时间更新了VS2012,界面比VS2010看起舒服了不少,心情愉悦啊。 这两天做个数据采集的项目,需要在windows平台写一个简单的调...

用DUMPBIN.EXE来得到某个DLL中所输出的符号的清单

使用VC时,可以用DUMPBIN.EXE来得到某个DLL中所输出的符号的清单。如下面的 命令:dumpbin -exports Cmpnt1.dll如:C:/WINDOWS/system32>dump...

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

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

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

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

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

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

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

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

关于使用androidstudio2.2通过CMake,NDK开发OpengGL程序中出现的extern “C”问题

开发环境android studio 2.2 android 6.0 API23 CMake 3.6.3155560 LLDB2.3.3614996 NDK 14.0.3770861 通过配...

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

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

链接指示: extern "C" C和C++混合编程问题

文章转载自http://apps.hi.baidu.com/share/detail/21645433   分析以下一段代码: /*=======sum.h=========*/ #ifnde...

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

c与c++连接发现出现了找不到具体函数的错误:以下是假设旧的C程序库C的头文件/———–c.h————–/#ifndef _C_H_ #define _C_H_ extern int add(int ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:extern "C"的问题研究
举报原因:
原因补充:

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