我有一个带有一堆常量的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()中......之后它们不会改变。
答案 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)
从设计的角度来看,您应该切换到Configuration
或Option
对象。
每个类都依赖于要提供的此对象的实例,并且您可以使用不同的初始化例程:从文件,命令行等...
更好的是,你会避免全局变量!