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

项目场景:

项目较大时,通常需要调用许多外部文件。对我这个新手来说,文件目录的管理一直很头疼。之前每次新建一个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


版权声明:本文为weixin_44954996原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。