每个文件都应位于同一目录中,并且可以逐字复制。我遇到了一个非常奇怪的属性访问问题,对于我目前对C ++的了解我不了解。
main.cpp
#include "someclass.hpp"
SomeClass d = SomeClass();
int main(int argc, const char * argv[])
{
SomeClass c = SomeClass();
return 0;
}
someclass.hpp
#ifndef someclass_hpp
#define someclass_hpp
class SomeClass
{
public:
SomeClass();
};
#endif /* someclass_hpp */
someclass.cpp
#include "someclass.hpp"
#include <iostream>
std::string s = "hi";
SomeClass::SomeClass()
{
std::cout << "\"" + s + "\"" << std::endl;
}
控制台
$ g++ main.cpp someclass.hpp someclass.cpp
$ ./a.out
""
"hi"
我已经完成了一个相当大的项目,并删除了所有内容,直到剩下这个非常简单的错误为止,我一直盯着它看了一个小时,无法解决问题。这是我未考虑正确方法的简单问题吗?据我所知,代码应该输出两次“ hi”,是什么使 a 的初始化上下文与 b 有所不同?
我目前可以解决“不要在方法之外初始化变量”,但是我仍然很好奇为什么会发生这种情况。
答案 0 :(得分:2)
请记住,std::string s = "hi";
和SomeClass d =
SomeClass();
都是全局初始化的,并且初始化的顺序不是
保证。这也可能导致不确定的行为。
仅供参考:您的示例在最新的Fedora上崩溃了。
UPD 正如@davidbak正确提到的那样,我的答案是关于不同编译单元中全局初始化的顺序。
答案 1 :(得分:1)
全局变量初始化不能保证顺序。由于std::string s = "hi";
和SomeClass d = SomeClass();
都在全局范围内,因此在创建SomeClass d
时,string s
未初始化,因此""
输出。正如dshil正确指出的那样,这将导致不确定的行为,应该避免。