extern

extern 是 C++ 中的一个关键字,用于声明一个变量或函数是在其他文件中定义的。它的作用是告诉编译器在链接时在其他文件中寻找该变量或函数的定义。

在 C++ 中,如果一个变量或函数在多个文件中使用,那么就需要在每个文件中都声明一次该变量或函数。这时就可以使用 extern 关键字来声明该变量或函数是在其他文件中定义的。

除了在不同文件中共享变量和函数的定义、在函数中使用全局变量、在头文件中声明变量和函数、在类中声明静态成员变量外,extern 还有一些其他的用法:

  1. 在模板中使用外部变量
  2. 在命名空间中使用外部变量
  3. 在静态库中使用外部变量

声明变量

例如,假设我们有两个文件 a.cppb.cpp,它们都需要使用同一个全局变量 g_var,那么可以在 a.cpp 中定义该变量,并在 b.cpp 中使用 extern 来声明该变量:

// a.cpp
int g_var = 0; // b.cpp
extern int g_var; int main() {
// 使用全局变量 g_var
g_var = 1;
return 0;
}

在上面的代码中,我们在 a.cpp 中定义了全局变量 g_var,并在 b.cpp 中使用 extern 来声明该变量。这样在链接时,编译器就会在其他文件中寻找该变量的定义。

声明函数

除了变量,extern 关键字也可以用于声明函数。例如,假设我们有两个文件 a.cppb.cpp,它们都需要使用同一个函数 foo(),那么可以在 a.cpp 中定义该函数,并在 b.cpp 中使用 extern 来声明该函数:

// a.cpp
void foo() {
// 函数实现
} // b.cpp
extern void foo(); int main() {
// 调用函数 foo()
foo();
return 0;
}

在上面的代码中,我们在 a.cpp 中定义了函数 foo(),并在 b.cpp 中使用 extern 来声明该函数。这样在链接时,编译器就会在其他文件中寻找该函数的定义。

在类中声明静态成员变量

在 C++ 中,如果一个类有静态成员变量,那么需要在类的定义外部进行定义。如果该静态成员变量是在其他文件中定义的,那么可以使用 extern 来声明它。例如:

// a.cpp
class MyClass {
public:
static int s_var;
}; int MyClass::s_var = 0; // b.cpp
class MyClass; extern int MyClass::s_var; void foo() {
// 使用静态成员变量 s_var
MyClass::s_var++;
}

在上面的代码中,我们在 a.cpp 中定义了类 MyClass,并在类的定义外部定义了静态成员变量 s_var。在 b.cpp 中,我们使用 extern 来声明静态成员变量 s_var 是在其他文件中定义的。在函数 foo() 中,我们可以直接使用静态成员变量 s_var

在静态库中使用外部变量

在 C++ 中,如果在静态库中使用一个外部变量,那么可以使用 extern 来声明该变量是在其他文件中定义的。例如:

// a.cpp
int g_var = 0; // b.cpp
void foo() {
// 使用外部变量 g_var
extern int g_var;
g_var++;
} // libmylib.a
ar rcs libmylib.a a.o b.o

在上面的代码中,我们在 a.cpp 中定义了全局变量 g_var,在 b.cpp 中使用 extern 来声明该变量是在其他文件中定义的。然后将 a.ob.o 打包成静态库 libmylib.a。在其他程序中使用该静态库时,就可以直接使用外部变量 g_var

c++全局变量extern的更多相关文章

  1. IOS总结 静变量static、全局变量extern、局部变量、实例变量

    1.静态变量 static 什么是静态变量:从面向对象的角度触发,当需要一个数据对象为整类而非某个对象服务,同时有力求不破坏类的封装性,既要求此成员隐藏在类的内部,有要求对外不可见的时候,就可以使用s ...

  2. 当局部变量遇上全局变量——extern及花括号用法举例

    请阅读以下代码并说出它的输出结果. #include <stdio.h> ; int foo() { ; { extern int val; printf("val_foo = ...

  3. Keil C 中全局变量 extern 的使用

    在KEIL C中,有多个源文件使用到全局变量时,可以在一个源文件中定义全局变量,在另外的源文件中用extern 声明该变量,说明该变量定义在别的文件中,将其作用域扩展到此文件. 例如:有以下两个源文件 ...

  4. IOS开发之----全局变量extern的使用

    extern,作用在IOS中,为了使用全局变量.比写在appDelegate和定义单例方便一些: 举例: 1.MyExternClass.h添加这个类,并在.m文件添加 代码 #import &quo ...

  5. 利用extern共享全局变量

    方法: 在xxx.h中利用extern关键字声明全局变量 extern int a; 在xxx.cpp中#include<xxx.h> 再定义 int a; 赋不赋初值无所谓,之后该全局变 ...

  6. 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)

    李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...

  7. C语言中定义全局变量

    (1)在C语言的头文件中定义变量出现的问题 最好不要傻嘻嘻的在头文件里定义什么东西.比如全局变量: /*xx头文件*/ #ifndef  _XX_头文件.H #define  _XX_头文件.H in ...

  8. C++全局变量的声明和定义

    (1)编译单元(模块)     在VC或VS上编写完代码,点击编译按钮准备生成exe文件时,编译器做了两步工作: 第一步,将每个.cpp(.c)和相应的.h文件编译成obj文件: 第二步,将工程中所有 ...

  9. iOS- static extern const

    1.静态变量  static 什么是静态变量:从面向对象的角度触发,当需要一个数据对象为整类而非某个对象服务,同时有力求不破坏类的封装性,既要求此成员隐藏在类的内部,有要求对外不可见的时候,就可以使用 ...

  10. c语言局部变量 静态局部变量 全局变量与静态全局变量

    基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...

随机推荐

  1. H-ui JQuery 给单选按纽赋值不生效

    H-ui JQuery 给单选按纽赋值不生效 $("#sex-1").attr('checked',true) 原因,iradio-blue 样式的原因 把下面代码注释掉就可以了 ...

  2. PPT 三维地球动画

    Windows 10 系统自带 画图3D,可以无缝和PPT衔接在一起 百度找一张图片 拖动,包围 到PPT中,插入3D模型(只有 office 365 有) 我这边没有,所以不好继续了 视频地址:(h ...

  3. Kubernetes(K8S) helm chart

    感觉和放到一个 yaml 文件中,用 ---- 分隔,操作繁琐程度上,没有太大区别 创建自定义 Chart # 创建自定义的 chart 名为 mychart [root@k8smaster ~]# ...

  4. LVM----从CentOS7默认安装的/home中转移空间到根目录/(转载)

    本文转载地址:https://www.cnblogs.com/user-sunli/p/15484345.html LVM----从CentOS7默认安装的/home中转移空间到根目录/ 一.基础概念 ...

  5. 【辅助工具】SVN使用

    1.在对应路径下右键SVN checkout 2.输入对应的网址.用户名.密码 3.提交右键选择SVN commit.覆盖选择SVN update 4.编辑的时候右键TortoiseSVN-get l ...

  6. Mac | HomeBrew 安装 & 配置 MySQL

    这个是我最新并且一直推崇的方法: 1.安装:brew install mysql 2.开启mysql:mysql.server start 3.使用mysql的配置脚本:/usr/local/opt/ ...

  7. Kite 使用教程 轻量级代码提示

    概述 今天看小甲鱼视频的VSC Python 安装教程里视频博主强烈推荐安装Kite插件 ,这是什么玩意? 下载下来试一试? 原来:就是一个代码提示插件.. 说白了" 就是让开发者 在轻量级 ...

  8. warning: LF will be replaced by CRLF in public/tinymce/langs/zh_CN.js

    windows使用git时出现:warning:LF will be replaced by CRLF windows中的换行符为 CRLF, 而在linux下的换行符为LF,所以在执行add . 时 ...

  9. Vue项目实现导入导出Excel表格功能

    前提:在我的项目中我使用的是ElementUi前端UI框架,用到的是里面的Upload上传组件. 第一步:需要安装三个依赖 npm install -S file-saver xlsx  (这里其实安 ...

  10. watch监听对象遇坑

    当以下数据,有一个变化,就重新调接口.  formInline: {         needTrain: '',         trainResult: '',         userNameS ...