C++/QT如何在多文件中使用全局变量

本文介绍了一个新手在大型项目中如何通过extern关键字解决文件路径管理问题,避免头文件中变量重定义,实现常量和非常量变量在多文件间的共享。阅读者可以学习如何在头文件声明并在cpp文件中定义变量,以提高代码组织和维护性。
摘要由CSDN通过智能技术生成

项目场景:

项目较大时,通常需要调用许多外部文件。对我这个新手来说,文件目录的管理一直很头疼。之前每次新建一个QT的类,都需要在头文件中重复声明相同的文件路径,以供cpp文件使用,但是一旦这个外部文件的路径被修改了,那么就需要将这些不同文件的路径全部修改,过程相当繁琐枯燥。如果能事先定义一个文件,其他文件都可以调用其中的路径变量,就很舒服了。


问题描述

但是如果在头文件中直接申明并定义,当多个文件#include时又会导致变量重定义。

//demo.h
//注意这种写法不好,最好不要这么写
const int num = 10;

解决方案:

所以后来仔细学习了一下extern关键字。现将最直接的使用方法,记录如下:
(不想了解原理的小伙伴可以直接套用就行,想了解的话,有几篇文章写的很好,链接放在了文章的最后)

多文件中共享非const变量

在头文件中的变量申明中加上extern关键字。

mypathheader.h(头文件写法)
#ifndef MYPATHHEADER_H
#define MYPATHHEADER_H

#include <QString>

//所有Image文件夹
extern QString path_images;
extern QString path_images_source;

#endif // MYPATHHEADER_H
mypathheader.cpp(cpp文件写法)
#include "mypathheader.h"

//所有Image文件夹
QString path_images = "../../images/";
QString path_images_source = path_images + "source/";

多文件中共享const变量

在头文件和cpp文件中的变量声明和定义中都加上extern const。

mypathheader.h(头文件写法)
#ifndef MYPATHHEADER_H
#define MYPATHHEADER_H

#include <QString>

//所有Image文件夹
extern const QString path_images;
extern const QString path_images_source;

#endif // MYPATHHEADER_H
mypathheader.cpp(cpp文件写法)
#include "mypathheader.h"

//所有Image文件夹
extern const QString path_images = "../../images/";
extern const QString path_images_source = path_images + "source/";

总结:

个人水平有限,将之前看的几个博文中的重要信息点摘录如下,不做个人注解:

  1. “声明”与“定义”的概念不同!根据C++标准的规定,一个变量声明必须同时满足两个条件,否则就是定义:
    (1)声明必须使用extern关键字;(2)不能给变量赋初值
    extern int a; //声明
    int a; //定义
    int a = 0; //定义
    extern int a =0; //定义
  2. 一般在头文件中申明,用extern,在cpp中定义。 如果在头文件中定义,如果这个头文件被多个cpp引用,会造成重复定义的链接错误。
  3. 默认情况下,一个const对象仅在本文件内有效,如果多个文件中出现了同名的const变量时,其实等同于在不同的文件中分别定义了独立的变量。如果想让const对象只在一个文件中定义,而在其他多个文件中声明并使用它。方法是对于const变量不管是声明还是定义都添加extern关键字。
  4. C++ 编译器在运行项目时,会在预处理阶段直接将 #include 引入的头文件替换成该头文件中的内容(就可以理解为傻瓜式的复制粘贴)。

参考博文:

我是看这个直接看懂了: https://blog.csdn.net/qq_27664167/article/details/82859852

这个也写的很好: https://blog.csdn.net/xingjiarong/article/details/47656339

这个原理讲的很全: https://www.cnblogs.com/invisible2/p/6905892.html

这个原理作为补充,const怎么用我是从这里知道的: https://www.cnblogs.com/broglie/p/5524932.html

这个个人感觉一般,其中还有不严谨的地方,但是可以作为补充理解: http://c.biancheng.net/view/7644.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值