c++全局变量extern
extern
extern
是 C++ 中的一个关键字,用于声明一个变量或函数是在其他文件中定义的。它的作用是告诉编译器在链接时在其他文件中寻找该变量或函数的定义。
在 C++ 中,如果一个变量或函数在多个文件中使用,那么就需要在每个文件中都声明一次该变量或函数。这时就可以使用 extern
关键字来声明该变量或函数是在其他文件中定义的。
除了在不同文件中共享变量和函数的定义、在函数中使用全局变量、在头文件中声明变量和函数、在类中声明静态成员变量外,extern
还有一些其他的用法:
- 在模板中使用外部变量
- 在命名空间中使用外部变量
- 在静态库中使用外部变量
声明变量
例如,假设我们有两个文件 a.cpp
和 b.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.cpp
和 b.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.o
和 b.o
打包成静态库 libmylib.a
。在其他程序中使用该静态库时,就可以直接使用外部变量 g_var
。
c++全局变量extern的更多相关文章
- IOS总结 静变量static、全局变量extern、局部变量、实例变量
1.静态变量 static 什么是静态变量:从面向对象的角度触发,当需要一个数据对象为整类而非某个对象服务,同时有力求不破坏类的封装性,既要求此成员隐藏在类的内部,有要求对外不可见的时候,就可以使用s ...
- 当局部变量遇上全局变量——extern及花括号用法举例
请阅读以下代码并说出它的输出结果. #include <stdio.h> ; int foo() { ; { extern int val; printf("val_foo = ...
- Keil C 中全局变量 extern 的使用
在KEIL C中,有多个源文件使用到全局变量时,可以在一个源文件中定义全局变量,在另外的源文件中用extern 声明该变量,说明该变量定义在别的文件中,将其作用域扩展到此文件. 例如:有以下两个源文件 ...
- IOS开发之----全局变量extern的使用
extern,作用在IOS中,为了使用全局变量.比写在appDelegate和定义单例方便一些: 举例: 1.MyExternClass.h添加这个类,并在.m文件添加 代码 #import &quo ...
- 利用extern共享全局变量
方法: 在xxx.h中利用extern关键字声明全局变量 extern int a; 在xxx.cpp中#include<xxx.h> 再定义 int a; 赋不赋初值无所谓,之后该全局变 ...
- 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)
李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...
- C语言中定义全局变量
(1)在C语言的头文件中定义变量出现的问题 最好不要傻嘻嘻的在头文件里定义什么东西.比如全局变量: /*xx头文件*/ #ifndef _XX_头文件.H #define _XX_头文件.H in ...
- C++全局变量的声明和定义
(1)编译单元(模块) 在VC或VS上编写完代码,点击编译按钮准备生成exe文件时,编译器做了两步工作: 第一步,将每个.cpp(.c)和相应的.h文件编译成obj文件: 第二步,将工程中所有 ...
- iOS- static extern const
1.静态变量 static 什么是静态变量:从面向对象的角度触发,当需要一个数据对象为整类而非某个对象服务,同时有力求不破坏类的封装性,既要求此成员隐藏在类的内部,有要求对外不可见的时候,就可以使用 ...
- c语言局部变量 静态局部变量 全局变量与静态全局变量
基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...
随机推荐
- 大数据-业务数据采集-FlinkCDC 读取 MySQL 数据存入 Kafka
目录 作用 app 产生各层数据的 flink 任务 bean 数据对象 common 公共常量 utils 工具类 app.ods.FlinkCDC.java package com.atguigu ...
- Intellij IDEA 集成 Docker 发布
1. Docker开启远程访问,注意端口不要用默认的,防止被攻击 [root@localhost ~]# vi /usr/lib/systemd/system/docker.service 修改 # ...
- python 读取数据调翻译更新表字段
import time import requests import pymysql import datetime import random from hashlib import md5 imp ...
- websocket群聊实战
演示及源码地址: 演示地址:https://www.wchime.xyz/#/ 后端代码:https://gitee.com/mom925/wchime-web-api 前端代码:https://gi ...
- AnaConda 虚拟环境创建失败的解决方案
问题:创建环境时,AnaConda界面下放一直显示正在创建中,然后过几分钟报错! 我的解决方法:--关闭 VPN... 其他解决方案请参考这篇文章:Here
- 【每日一题】40. 旅游 (树形DP解决树的最大独立集)
补题链接:Here 算法涉及:树形DP寻找树上最大独立集 一开始想到是利用 树形DP 找树的直径问题,但这里由于可以利用走过的点衍生,所以不符合树的直径问题 查询了一下资料这道题是属于: 树的最大独立 ...
- 体验函数计算 FC 3.0,写测评赢取索尼头戴式耳机
11月1日云栖大会,函数计算3.0全新升级,相对函数计算2.0,3.0版本突出易用性.高弹性,并且可以和更多阿里云服务无缝集成.业内首发神龙 Serverless GPU 架构,冷启动大幅优化,全链路 ...
- mybatis-plus 对date类型取当天的数据
数据库中的字段是时间类型,要取出当天的数据,使用mybatis-plus 如何实现,思路是用 时间大于当天凌晨,小于当天23:59:59的时间 //调用的代码Date start = DateUtil ...
- location对象的方法
location.assign() 跟href一样,可以跳转页面(也称为重定向页面). location.replace() 替换当前页面,因为不记录历史,所以不能后退页面. location.rel ...
- d3条形图案例