C ++:静态变量不存在于文件之间

时间:2011-03-31 15:02:01

标签: c++

我有一个带有一堆常量的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()中......之后它们不会改变。

4 个答案:

答案 0 :(得分:14)

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

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

每个类都依赖于要提供的此对象的实例,并且您可以使用不同的初始化例程:从文件,命令行等...

更好的是,你会避免全局变量!