语法说明:

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. Spring Boot JPA 连接数据库

    本文将介绍怎样在Spring Boot project中加入JPA作为持久化方式. 改动 pom.xml 依赖 与上一篇介绍的 jdbc 不同的是 spring-boot-starter-jdbc 改 ...

  2. eclipse 添加库

    Window ->Preferences ->Java ->Build Path ->User Libraries New,起个名字,如myLibrary add jars,添 ...

  3. [翻译]Unity中的AssetBundle详解(三)

    构建AssetBundles 在AssetBundle工作流程的文档中,我们有一个示例代码,它将三个参数传递给BuildPipeline.BuildAssetBundles函数.让我们更深入地了解我们 ...

  4. iOS UIView控件的常用属性和方法的总结

    一 UIVIew 常见属性1.frame 位置和尺寸(以父控件的左上角为原点(0,0))2.center 中点 (以父控件的左上角为原点(0,0))3.bounds 位置和尺寸(以自己的左上角为原点 ...

  5. [树套树]K大数查询

    有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少.为了 ...

  6. 【转载】u3d游戏客户端架构(---)

    原文:http://blog.csdn.net/xtxy/article/details/8474506 主要是mvc架构, M层为数据层,两个用途:1保存数据:2发送数据更新信息: V层为视图层,两 ...

  7. 【POJ 3461】 Oulipo

    [题目链接] 点击打开链接 [算法] KMP [代码] #include <algorithm> #include <bitset> #include <cctype&g ...

  8. 更改ssh远程登录端口.sh

    #!/bin/bash #liu_dong sed -i "s/\#Port 22/Port 31961/g" /etc/ssh/sshd_config sed -i " ...

  9. 图的理解:深度优先和广度优先遍历及其 Java 实现

    遍历 图的遍历,所谓遍历,即是对结点的访问.一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: 深度优先遍历 广度优先遍历 深度优先 深度优先遍历,从初始访问结点出发,我们知道 ...

  10. error: expected ‘)’ before ‘PRId64’(转载)

    转自:www.xuebuyuan.com/2077822.html error: expected ‘)’ before ‘PRId64’ 原来这个宏定义给c用的,C++要用它,就要定义一个__STD ...