如何引用一个已经定义过的全局变量?

ops/2024/12/28 19:58:38/

如何引用一个已经定义过的全局变量?
答 、可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变量,假定你将那个变量写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

好的,下面用 C++ 编写一个示例,说明使用头文件和 extern 关键字来引用已定义的全局变量的区别。

示例结构

我们将创建三个文件:

  1. global.h — 声明全局变量。
  2. global.cpp — 定义全局变量。
  3. main.cpp — 使用头文件和 extern 引用全局变量。

代码

1. global.h
#ifndef GLOBAL_H
#define GLOBAL_H// 声明全局变量
extern int globalVar;#endif
2. global.cpp
#include "global.h"// 定义全局变量
int globalVar = 42;
3. main.cpp
#include <iostream>
#include "global.h"   // 引用头文件的方式extern int globalVarWrong; // 使用 extern 引用,但拼写错误int main() {// 使用头文件引用的全局变量std::cout << "globalVar (通过头文件): " << globalVar << std::endl;// 使用 extern 引用的全局变量std::cout << "globalVarWrong (通过 extern,拼写错误): " << globalVarWrong << std::endl;return 0;
}

解释

  • main.cpp 中,我们通过头文件 global.h 引用了正确声明的 globalVar
  • 同时,我们使用 extern 声明了一个变量 globalVarWrong,但这个名称是错误的,实际变量名是 globalVar

编译和错误信息

  1. 使用头文件声明的变量globalVarglobal.h 中正确声明,因此在 main.cpp 中编译和连接都不会有问题。
  2. 使用 extern 声明的错误变量globalVarWrong 是通过 extern 引用的,且名称错误,因此编译器不会报错,但在连接时会报错。

连接错误示例

在编译和连接时,将出现类似以下的连接错误(具体错误信息取决于编译器):

main.cpp:(.text+0x...): undefined reference to `globalVarWrong'

总结

  • 使用头文件声明的变量,如果拼写错误,在编译阶段会检测到,因为头文件的声明需要与定义匹配。
  • 使用 extern 引用的变量,如果拼写错误,编译阶段不会报错,但会在连接阶段报错,因为 extern 只是一个引用声明,编译器不会检查是否已定义。

http://www.ppmy.cn/ops/130874.html

相关文章

Android -- (静态广播) APP 监听U盘挂载

Android – (静态广播) APP 监听U盘挂载 注册广播&#xff08;AndroidManifest.xml&#xff09;&#xff1a; <receiver android:name".receiver.MountReceiver"><intent-filter><action android:name"android.intent.action.MEDIA_MOUNTED"…

【基础】使用template替换yaml中的变量

前言 在接口自动化测试的时候&#xff0c;yaml 文件一般放测试的数据或当配置文件使用&#xff0c;yaml 文件存放静态的数据是没问题的&#xff0c;python的数据类型基本上都是支持的。 有时候我们想在 yaml 文件中引用变量来读取 python 代码的设置值。 template 使用 temp…

【Union of Rectangles】:矩形的并集

【Union of Rectangles】&#xff1a;矩形的并集 C语言版本C 版本Java版本Python版本 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; A rectangle in a plane having its sides parallel to the coordinate axis, is determined by the coo…

chrome编辑替换js文件的图文教程

一、找到要修改替换的js文件 二、将文件保存到本地 三、在本地新建一个文件 路径最好跟你要替换的文件的路径保持一致&#xff0c; 四、选中js文件替换 回到原文件右击选择保存并覆盖 点击完保存并覆盖之后回到替换的新文件中&#xff0c;在自动生成的webpack文件中对文件进…

Android中同步屏障(Sync Barrier)介绍

在 Android 中&#xff0c;“同步屏障”&#xff08;Sync Barrier&#xff09;是 MessageQueue 中的一种机制&#xff0c;允许系统临时忽略同步消息&#xff0c;以便优先处理异步消息。这在需要快速响应的任务&#xff08;如触摸事件和动画更新&#xff09;中尤为重要。 在 An…

操作系统——计算机系统概述——1.4操作系统结构

目录 操作系统的体系结构 大内核&#xff08;宏内核/单内核&#xff09;&#xff1a; 微内核&#xff1a; 分层法 模块化 操作系统的体系结构 大内核&#xff08;宏内核/单内核&#xff09;&#xff1a; 将操作系统的主要功能模块都作为系统内核&#xff0c;运行在核心态。…

RabbitMQ应用

1. 7种工作模式介绍 1.1 Simple(简单模式) P: ⽣产者,也就是要发送消息的程序C: 消费者,消息的接收者Queue: 消息队列(图中⻩⾊背景部分)类似⼀个邮箱,可以缓存消息;⽣产者向其中投递消息,消费者从 其中取出消息 特点: ⼀个⽣产者P&#xff0c;⼀个消费者C, 消息只能被消费…

macOS开发环境配置与应用开发教程

macOS开发环境配置与应用开发教程 引言 macOS是一个强大的操作系统&#xff0c;广泛应用于软件开发&#xff0c;尤其是iOS和macOS应用开发。本文将详细介绍如何配置macOS开发环境&#xff0c;并通过实例演示如何进行应用开发。希望通过这篇文章&#xff0c;帮助读者快速上手m…