语法说明:

extern 可以置于变量或者函数前,以标示变量或者函数的在别的文件中定义,提示编译器遇到此变量和函数后,在其他模块中寻找其定义。此外extern也可用来进行链接指定。

即 extern 有两个作用:

一、与 ”C” 一起连用,如: extern “C” void fun(int a, int b);

此时编译器在编译 fun 这个函数名时,按着 C 的规则去翻译相应的函数名而不是 C++ 的。

C++的规则在编译这个函数名时会把 fun 这个名字变类似 fun@aBc_int_int#%$ 的格式。(注意:C++ 支持函数的重载)

二、当 extern 不与 ”C” 在一起修饰变量或函数时,如在头文件中: extern int g_Int;

它的作用就是 声明 函数或全局变量。其声明的函数和变量可以在本模块(编译单元,如 .cpp 文件)或其他模块中使用(注意:这里是声明,不是定义)

也就是说 B 模块要是引用 A 模块中定义的全局变量或函数时,它只要包含 A 模块的头文件即可。

在编译阶段,模块 B 虽然找不到该函数或变量,但它不会报错,它会在链接时从模块 A 生成的目标代码中找到此函数。

//fileA.cpp
int i = ; // declaration and definition //fileB.cpp
extern int i; // declaration only. same as i in FileA //fileC.cpp
extern int i; // declaration only. same as i in FileA //fileD.cpp
int i = ; // LNK2005! 'i' already has a definition.
extern int i = ; // same error (extern is ignored on definitions)

声明与定义的区别:

extern int a; //声明

int a; //定义
int a = ; //定义
extern int a =; //定义

一般在头文件中申明,用 extern, 在 cpp 中定义。 如果在头文件中定义,如果这个头文件被多个 cpp 引用,编译时会报重复定义的错误。

另外在 .h 文件中通过 static 来声明变量,这样可以被其他文件引用,但程序运行时会在每个模块中都创建一个相同的变量。

如果在 .cpp 文件中声明 static 变量,其他 .cpp 文件是无法访问该变量的。

参考资源:

https://blog.csdn.net/u012611878/article/details/78697971

https://docs.microsoft.com/en-us/cpp/cpp/extern-cpp?view=vs-2019

cpp extern 关键字用法的更多相关文章

  1. C++中extern关键字用法小结

    总结C++中关于extern关键字的用法. 1.变量的生明和定义中 C++语言支持分离式编译机制,该机制允许将程序分割为若干个文件,每个文件可被独立编译.为了将程序分为许多文件,则需要在文件中共享代码 ...

  2. 解决全局变量共享---C语言的extern关键字用法

    在调试程序时,有一个参数需要在多个函数之间传递,因为是作为调试参数,不想将参数引入到函数中. 很自然的想到使用全局变量来表示这个公共参数,工程代码的结构如下: main.c test.c test.h ...

  3. C语言中的extern关键字用法

    在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”. 1. extern修饰变量的声明.举例来说,如果文件a.c需要引用b.c中变量int v ...

  4. extern "c"用法解析

    转自: extern "c"用法解析 - 简书 引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语言, ...

  5. extern的用法

    extern作为外部函数声明的用法: 1. 可以扩展函数的应用范围: 107.h #ifndef _107H_ #def _107H_ extern void func(); #endif 107.c ...

  6. extern "C" 用法解析

    extern "c"用法解析 作者 作者Jason Ding ,链接http://www.jianshu.com/p/5d2eeeb93590 引言 C++保留了一部分过程式语言的 ...

  7. 有关extern的用法

    1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同.作为一种欲与C兼容的语言, C++保留了一部分过程式 ...

  8. 变量的声明和定义以及extern的用法

    变量的声明和定义以及extern的用法                                          变量的声明不同于变量的定义,这一点往往容易让人混淆. l         变量 ...

  9. 关于extern的用法

    extern表示该变量或者函数时在另一个地方定义了. 在C++编程中,如果将程序分为多个文件,则需要有在文件间共享代码的方法,这时如果一个变量或者函数需要在多个文件中使用,则可以使用extern来声明 ...

随机推荐

  1. 2016/06/02 网摘记录 svn 服务器端 客户端 安装使用

    http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2408089.html http://www.cnblogs.com/xiaobaihom ...

  2. REST RPC HTTP vs 高性能二进制协议 序列化和通信协议

    edisonchou https://mp.weixin.qq.com/s/-XZXqXawR-NxJMPCeiNsmg .NET Core微服务之服务间的调用方式(REST and RPC) Edi ...

  3. passive aggressive(pa)和average perceptron(ap)

    passive aggressive(pa)和average perceptron(ap)

  4. springboot 项目 docker化部署

    最近公司项目需要docker化,项目所使用的框架是springboot,linux环境.第一次接触docker化方面的技术.做的时候,所接触的新知识比较多,留下此文,以便以后用到的时候快速入手. 修改 ...

  5. 关于eclipse的resource文件没有发布到tomcat上的解决方案

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/luman1991/article/details/53457302

  6. EhCache+Redis实现分布式缓存

    Ehcache集群模式 由于 EhCache 是进程中的缓存系统,一旦将应用部署在集群环境中,每一个节点维护各自的缓存数据,当某个节点对缓存数据进行更新,这些更新的数据无法在其它节点中共享,这不仅会降 ...

  7. POJ2443 Set Operation (基础bitset应用,求交集)

    You are given N sets, the i-th set (represent by S(i)) have C(i) element (Here "set" isn't ...

  8. BZOJ_1563_[NOI2009]诗人小G_决策单调性

    BZOJ_1563_[NOI2009]诗人小G_决策单调性 Description Input Output 对于每组数据,若最小的不协调度不超过1018,则第一行一个数表示不协调度若最小的不协调度超 ...

  9. Ruby: Print WIN32OLE method names in Ruby

    class WIN32OLE   def list_ole_methods     method_names = ole_methods.collect {|m| m.name}     puts m ...

  10. IOCP编程小结(上)

    前段时间接手了一个网络游戏前端连接服务器的开发工作,由于服务器需要在windows平台上部署,并且需要处理大量的客户端连接,因此采用IOCP来做为服务器端的编程模型就成了不二选择.虽然我对服务器开发并 ...