【问题标题】:How do I export an initialized variable from a header file to my main.cpp file in C++?如何将初始化变量从头文件导出到 C++ 中的 main.cpp 文件?
【发布时间】:2017-11-21 22:41:27
【问题描述】:

我的ma​​in.cpp包含头文件setup.h
setup.h从一个文件中读取数据,即然后在 ma​​in.cpp 中使用。
setup.h 读取的数据文件中,一条数据是一个浮点变量,我需要在 ma​​in.cpp 中的函数(来自另一个头文件)中使用它强>。

在头文件中定义变量时不能使用 extern,因为这样我就不能用文件中的数据初始化它(编译时出错):

setup.h

...
extern float G = 0; 
input >> G;
...

ma​​in.cpp

...
float G;
instance function(G);
...

如何在我的 ma​​in.cpp 文件中获取初始化变量?

【问题讨论】:

  • 查看之前的stackoverflow问题stackoverflow.com/questions/3627941/…
  • 为了保持一致性,我希望我的头文件中的所有数据都由同一个函数读出,这个解决方案可以工作,但我需要添加一个额外的 .cpp 文件才能读出这个值,我觉得很乱。

标签: c++ header extern


【解决方案1】:

在头文件中你应该只声明变量,以便编译器知道它存在于某个地方:

extern float G;

您必须在其中一个编译单元 (cpp) 中定义变量。然后你可以初始化它:

float G = 0.0;

不要滥用全局变量 ;-)

【讨论】:

  • 我想避免必须在 .cpp 文件中对其进行初始化,因为我希望使用 .h 文件中的函数读出我的所有数据,我想那是不可能的?
  • @Joshua 不,确实,这是不可能的。包含不是一个自主编译单元。可以理解为如果您将其内容放在您的 cpp 文件中,替换 #include 行。如果您在标题中定义您的函数(即使用函数体),它将在您包含它的所有 cpp 文件中定义。对于函数和(非外部)全局变量,这可能会导致链接冲突。如果您想重用一个不错的函数,请在标头中声明它(不包括主体),但在单独的 cpp 文件中定义它。
  • 感谢您的帮助,我将寻找另一种方法来解决它,因为应用我得到的答案需要用户两次指定数据文件的位置。跨度>
【解决方案2】:

当您使用#include-directive 包含文件时,您可以认为被包含文件的内容直接插入到#include-语句的位置。 这意味着头文件的内容不是单独编译的,而是在包含它的翻译单元的过程中(以及在包含它的地方的上下文中)。

所以你的代码可能会导致...

extern float G = 0; 
input >> G;
float G;

这有几个问题。

首先,变量G被定义了两次;请注意,extern 与初始化程序一起不仅声明而且实际上定义了一个变量(尽管有 extern-关键字)。 其次,input >> G 语句可能在文件范围内使用,这是不允许的(此类代码必须放在函数内)。

所以你唯一能做的就是……

setup.h

extern float G; // no initialisation here

setup.cpp

float init() {
  float dummy;
  cin >> dummy;
  return dummy;
}

float G = init(); // definition and initialization through a function

ma​​in.cpp

#include "setup.h"

int main() {
  cout << G;  // use of (initialized, externally defined) G
}

【讨论】:

  • 那么有没有办法在同一个头文件中创建并初始化一个变量,然后在main.cpp文件中使用呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
相关资源
最近更新 更多