当前位置: 首页 > news >正文

c++在头文件中声明全局的变量

头文件中定义全局变量

  • 引言
    • extern使用示例
    • 命名空间
    • inline变量
  • 总结

引言

之前在C++11中定义全局变量,要求在.h文件中的变量必须前面加extern关键字,在.cpp文件中定义。这样当多个源文件引入这个变量时,不会出现重复定义。
C++17及更高版本,可以使用关键字inline,在变量声明的同时定义,这样就不用分两个文件.h和.cpp了。

extern使用示例

将变量的声明和定义分离。
在头文件中使用extern声明变量:

// MyHeader.h
#pragma once
#include <QColor>extern QColor g_borderColor;  // 声明变量(不分配内存)

在源文件中进行定义,分配内存并初始化:

// MySource.cpp
#include "MyHeader.h"QColor g_borderColor = QColor(Qt::blue);  // 定义变量(分配内存)

原理说明:
extern 关键字:告诉编译器此变量在其他地方定义,当前文件仅声明(不分配内存)。
头文件保护:通过 #pragma once 或 #ifndef/#define 确保头文件仅被包含一次,避免重复声明。
注意:
初始化顺序:若变量依赖其他全局对象,需确保初始化顺序正确(可通过函数封装初始化逻辑)。
静态变量:若变量仅需在单个.cpp文件内使用,可用 static 关键字限制作用域,具体如下:

// MySource.cpp
static QColor g_borderColor = QColor(Qt::blue);  // 仅在当前文件可见

关于关键字static的使用,可自行查找。

命名空间

在extern的基础上可以使用命名空间来替换extern,以实现相同的效果。

// Config.h
#pragma once
#include <QColor>namespace Config {extern QColor borderColor;
}// Config.cpp
#include "Config.h"QColor Config::borderColor = QColor(Qt::blue);

inline变量

在C++17及更高的版本,可以使用inline关键字在头文件中直接定义变量。
使用示例:

// MyHeader.h
#pragma once
#include <QColor>namespace Config {inline QColor borderColor = QColor(Qt::blue);  // C++17+ 允许头文件直接定义
}

原理:inline 变量允许在多个翻译单元(.cpp文件)中存在同名定义,链接器会自动合并。
优点:无需单独的.cpp文件,代码更简洁。
限制:需要编译器支持 C++17(如 GCC 7+、Clang 5+、MSVC 19.15+)。

总结

优先使用 inline 变量(如果环境支持 C++17),代码最简洁。
兼容性要求高时,使用 extern + .cpp 的传统方式。
仅需单文件内使用时,可用 static 变量简化代码。
通过命名空间结合上述方法,既能组织代码,又能避免重复定义问题。

相关文章:

  • TNNLS-2020《Autoencoder Constrained Clustering With Adaptive Neighbors》
  • Deep Learning(手写字识别 - CNN)
  • 阿里的库存秒杀实现与Inventory Hint技术解析
  • Python 接入DeepSeek
  • 高等数学第七章---微分方程(§7.1-§7.3微分方程概念、一阶微分方程、一阶微分线性方程)
  • 生成式人工智能认证(GAI认证)官网 - 全国统一认证中文服务平台上线
  • 一种资源有限单片机处理cJSON数据的方法
  • WordPress 文章和页面:它们的区别是什么?
  • Qt 的.pro文件配置详解
  • 让 Cursor 教我写 MCP Client
  • Qt for Android编译报错解决 -------- Connection reset
  • 编程技能:字符串函数04,直接使用 strcpy,解决报错
  • C#上位机RS485通信控制变频器
  • CodeBuddy Craft,我的编程搭子
  • 股指期货套期保值怎么操作?
  • python: *args 与 **kwargs 用法
  • 从零实现一个高并发内存池 - 2
  • 【软件测试】第二章·软件测试的基本概念
  • 牛客——签到题
  • JavaScript篇:揭秘函数式与命令式编程的思维碰撞
  • 常州微信网站建设案例/焦作seo公司
  • 公务员可以自己做网站吗/seo诊断书
  • 保定网站建设公司大全/网络软文是什么意思
  • 服务器怎样做网站呢/谷歌广告优化
  • 网站内容方向/网站很卡如何优化
  • 提供网站建设管理/sem 推广软件