【问题标题】:How to declare global variables in seperate config.h file如何在单独的 config.h 文件中声明全局变量
【发布时间】:2021-05-06 17:27:35
【问题描述】:

我在 VScode 中编译时遇到了问题,而不是在 Visual Studio 中。

我的项目的包含文件夹中有一个头文件config.h。请注意,我已将 build_flags = -I include 添加到 platformio.ini。在config.h 中,我需要为我需要的选定数量的全局变量做一些声明。其他一切都是用指针等完成的。

我有两个问题。

  1. 在 config.h 中声明变量时,例如 int myVar,我得到一个多重声明错误。为什么?
  2. 我可以将变量声明为extern int myVar。但随后我需要在 .cpp 文件中重新声明变量 myVar,例如 main.cpp。如何做到最好?

最终,我如何在头文件中声明一个全局变量,将该头文件包含在其他几个文件中,然后全局使用该变量? (这主要是为了创建队列和信号量)

【问题讨论】:

  • 使用extern int myVar 选项。是的,您必须在所有 .cpp 文件中重新定义 myVar
  • 您不需要在 .cpp 文件中重新声明变量;您需要在 .cpp 文件中定义它。 声明说“某处有一个具有此名称和此类型的变量”。一个定义说“这是一个具有这个名称和这个类型的变量”。一个变量可以有任意多的声明;你只能有一个定义。
  • 感谢您的回复。为了简单起见,我是否应该创建一个随附的 config.cpp 文件来定义变量?我想尽可能地保持模块化。

标签: c++ global-variables


【解决方案1】:

如果您只需要全局常量,请参阅Defining global constant in C++。假设您需要一个可变的全局变量,有两种选择。无论哪种情况,我们的全局变量都只有一个实例。

经典解决方案:extern

// header file
extern MyQueue queue;

在这里,我们简单地说queue 是在其他源文件中定义的。

// source file
MyQueue queue{1, 2, 3};

然后,我们在源文件中定义它。 另见cppreference on external linkage

C++17 解决方案:inline

// header file (no source file needed)
inline MyQueue queue{1, 2, 3};

inline 对函数的作用与对变量的作用相同。它放宽了变量的单一定义规则 (ODR),允许我们在多个位置定义它。这样,当在多个源文件中包含标头时,我们不会收到任何链接器错误。

【讨论】:

    猜你喜欢
    • 2021-06-17
    • 2010-10-30
    • 2017-07-12
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    相关资源
    最近更新 更多