【问题标题】:C++: static vars not persisting between filesC ++:静态变量不在文件之间持久存在
【发布时间】:2011-03-31 15:02:01
【问题描述】:

我有一个带有一堆常量的 config.h 文件。 在 main.cpp 中,它将其中一个常量设置为某个值,然后调用 util.cpp 中的函数。

util.cpp也包含config.h,但是main.cpp设置的变量值不一样。

代码:

config.h:

static int MAX_NUMBER_OF_TRAINING_DATA = 1000;

main.cpp(主):

else if (strcmp(argv[i], "-mTrnData") == 0)
            {
                MAX_NUMBER_OF_TRAINING_DATA = atoi(argv[i + 1]);
            cout << "Number of data sets to be generated: " << MAX_NUMBER_OF_TRAINING_DATA << "\n\n";
                          // prints what I tell it
            }

在 utils.cpp 中

cout << "Number of data sets generated: " << MAX_NUMBER_OF_TRAINING_DATA << "\n\n";
    // prints the default value (in this case, 1000)

那么,我该如何解决这个问题,以便在我的 cpp 文件中记住我的 config.h 常量文件?

在 Java 中,您可以执行 Config.NAME_OF_CONSTANT ,因此,如果有办法在 C++ 中执行此操作,那就太好了。

我知道常量不应该改变,但它们唯一改变的时间是在 main() 中,从正在运行的程序中读取参数时......之后它们就不会改变。

【问题讨论】:

  • 一个改变值的变量很难被认为是一个常量

标签: c++


【解决方案1】:

每个翻译单元都会收到自己的static 数据副本。

验证这一点的最简单方法是在两个单元中打印MAX_NUMBER_OF_TRAINING_DATA 的地址 - 它会有所不同。为避免这种情况,请在标题中声明 extern 并在一个单元中定义一次,例如在 main.cpp 中。

除此之外,拥有这样的全局变量是邪恶的(其命名方案甚至暗示我们正在谈论常量!)。您可能会考虑重构代码,例如使用 getter GetMaxNumberOfTrainingData() 使值可用,同时将对它的写访问限制为单个单元。

【讨论】:

  • 但是不使用 getter 和 setter:在 Java 中,您可以执行 Config.NAME_OF_CONSTANT 之类的操作,有没有办法在 C++ 中执行此操作?我称它们为常量,因为除了改变它们的参数外,它们之后不会改变。
  • @DerNalia 没有什么能阻止你创建一个容器类来存储你的静态变量,但除非你使用 setter 和 getter,否则你仍然会遇到同样的问题。
【解决方案2】:

头文件中命名空间范围内的非 const static 变量是 几乎可以肯定是一个错误。你得到每个变量的一个实例 包含该文件的文件。如果你想使用相同的变量 几个不同的翻译单元,声明它extern(并且没有 初始化器)在标题中,然后定义它(没有 extern,尽管如果有 初始化程序)在单个源文件中。

【讨论】:

    【解决方案3】:

    根据定义,静态变量具有“文件范围”。因此,通过在头文件中声明它,每个包含它的 .c 文件都会获得自己的变量。它们彼此无关。

    您通常不应该在头文件中声明变量。如果您需要在多个模块中使用一个变量,请将其声明在一个文件中,并将它们作为 extern 添加到您需要的所有其他文件中。

    【讨论】:

      【解决方案4】:

      从设计的角度来看,您应该切换到ConfigurationOption 对象。

      每个类都依赖于要提供的该对象的一个​​实例,并且您可以有不同的初始化例程:来自文件、来自命令行等......

      更好的是,您可以避免使用全局变量!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-24
        • 2011-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-08
        • 2021-05-19
        相关资源
        最近更新 更多