【问题标题】:Global Variable within Multiple Files多个文件中的全局变量
【发布时间】:2010-09-02 14:12:01
【问题描述】:

我有两个需要访问公共变量的源文件。做这个的最好方式是什么?例如:

source1.cpp:

int global;

int function();

int main()
{
    global=42;
    function();
    return 0;
}

source2.cpp:

int function()
{
    if(global==42)
        return 42;
    return 0;
}

变量 global 的声明应该是 static、extern 还是应该在两个文件都包含的头文件中等等?

【问题讨论】:

  • this question 的可能重复项。
  • 重新编写代码以使用全局变量以外的内容 - 或将问题重新标记为“C”。当我需要 C++ 中的全局变量时,我通常将其设为可通过访问器方法公开读取的类的静态成员。如果可以缩小范围以便只有内部类成员使用访问器,那就更好了。很少有变量是真正“全局”的。
  • 取决于你想做什么
  • function() 对这两个来源也很常见,需要相同的处理。对于global,“最好的方法”是这样做。 eetimes.com/discussion/break-point/4025723/A-pox-on-globals
  • 静态类成员如何不是“真正的全局”?这听起来像是为了“成为 C++”而以不同的方式实现相同的目标。

标签: c++


【解决方案1】:

全局变量应在两个源文件包含的头文件中声明为extern,然后仅在其中一个源文件中定义:

common.h

extern int global;

source1.cpp

#include "common.h"

int global;

int function(); 

int main()
{
    global=42;
    function();
    return 0;
}

source2.cpp

#include "common.h"

int function()
{
    if(global==42)
        return 42;
    return 0;
}

【讨论】:

  • 如果您想了解更多信息和背后的解释:stackoverflow.com/a/10422050/1218075
  • 如何使用 QString,我使用 extern QString ciclo_actual; 作为全局变量,我可以在任何文件上定义它,但编译器总是抛出 QString does not name a type
  • 我们可以在 c++17 中将 extern 替换为 inline static 吗?
【解决方案2】:

您添加一个“头文件”,描述模块 source1.cpp 的接口:

source1.h

#ifndef SOURCE1_H_
#define SOURCE1_H_

extern int global;

#endif

source2.h

#ifndef SOURCE2_H_
#define SOURCE2_H_

int function();

#endif

并在每个文件中添加一个#include 语句,该语句使用此变量,并且(重要)定义该变量。

source1.cpp

#include "source1.h"
#include "source2.h"

int global;     

int main()     
{     
    global=42;     
    function();     
    return 0;     
}

source2.cpp

#include "source1.h"
#include "source2.h"

int function()            
{            
    if(global==42)            
        return 42;            
    return 0;            
}

虽然没有必要,但我建议将文件命名为 source1.h,以表明它描述了模块 source1.cpp 的公共接口。以同样的方式,source2.h 描述了 source2.cpp 中公开的内容。

【讨论】:

    【解决方案3】:

    在一个文件中您将其声明为 source1.cpp,在第二个文件中您将其声明为

    extern int global;
    

    当然,您真的不想这样做,并且可能应该发布一个关于您要实现的目标的问题,以便这里的人们可以为您提供其他实现目标的方法。

    【讨论】:

    • 您应该实现编译器为每个需要声明的编译单元获取相同的外部声明。当您将 extern 分布在所有需要对变量、函数进行 extern 访问的文件上时,很难使它们保持同步。这就是为什么:不要在消费 .cpp 文件中声明 extern。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多