在Myclass.cpp中:
const std::string FILE_NAME = "C:\\MyFileName.txt";
MyClass::MyClass()
{
ifstream fileToOpen;
fileToOpen.open(FILE_NAME); //FILE_NAME shows "" in debug
}
MyClass::OpenFile()
{
ifstream fileToOpen;
fileToOpen.open(FILE_NAME); //when called from another location, this resolves to proper file name.
}
我正在尝试在构造函数中打开一个文件。当我在该文件名上调用open函数时,常量变量解析为""
,但如果在其他地方调用该函数,则它可以正常工作。我在.h文件中尝试了相同的结果。任何人都可以解释原因吗?
答案 0 :(得分:4)
这似乎是因为初始化顺序而发生的。标准说(§3.6.2/ 2)(关于具有静态存储持续时间或线程存储持续时间的变量)
在单个翻译单元中定义的具有有序初始化的变量应按顺序初始化 他们在翻译单位的定义。 < ...>否则,变量的初始化相对于初始化是不确定地排序的 在不同的翻译单元中定义的变量。
FILE_NAME
和MyClass
的全局实例都具有静态存储持续时间,如果它们恰好位于不同的转换单元中,则它们的初始化顺序是未定义的。所以我想在你的情况下,MyClass
类型的全局变量在FILE_NAME
之前被初始化。
答案 1 :(得分:0)
解决问题的一种方法是使用一个返回文件名而不是使用变量的函数。
static std::string getFileName()
{
return "C:\\MyFileName.txt";
}
MyClass::MyClass()
{
ifstream fileToOpen;
fileToOpen.open(getFileName());
}