语法说明:

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. ul li menu

    第一步:建立一个无序列表我们先建立一个无序列表,来建立菜单的结构.代码是: <ul><li><a href="1">首页</a>&l ...

  2. js获取三天后的日期

    js获取三天后的日期 setDate getNowAddTreeFormatDate() { var date = new Date(); date.setDate(date.getDate()+3) ...

  3. [原创]java合并word文件

    需求背景 在互联网教育行业,做内容相关的项目经常碰到的一个问题就是如何动态生成一张word试卷.事先把题库中的每一道试题都已经保存成一个独立的word文件了,但是在选择了部分试题生成一张word试卷的 ...

  4. codeforces 673B B. Problems for Round(模拟)

    题目链接: B. Problems for Round time limit per test 2 seconds memory limit per test 256 megabytes input ...

  5. ios 给移动的控件添加点击事件

    前言: 给一个UIView做移动动画,虽然看起来frame在持续改变,但是它的frame已经是最终值了. 也就是说表面看到的动画都是假象,它的真实位置已经是固定的了.所以只有点击在他的真实frame范 ...

  6. RxJava RxBinding 按钮(Button) 点击(click)

    /********************************************************************* * RxJava RxBinding 按钮(Button) ...

  7. 「LuoguP2014」 选课

    Description 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学 ...

  8. Linux终端那件事儿

    我们将会讨论如何更好的控制用户终端:也就说是键盘输入与屏幕输出.除了这些,我们还会了解我们编写的程序如何由用户处读取输入,即使是在输入重定向的情况下,以及确保输出到屏幕的正确位置.这里所提供的一些底层 ...

  9. mysql负载均衡方案

    mysql负载均衡方案 一.直接连接 数据库的读写分离方案很多,这里介绍基于mysql数据库的读写分离方案. 比较常见的读写分离方案如下: 1 基于查询分离 最简单的分离方法是将读和写分发到主和从服务 ...

  10. javascript switch..... case

    switch(条件表达式) { case 常量: { 语句a; } break; case 常量: { 语句b; } break; case 常量: { 语句c; } break; ... case ...