我刚遇到一个奇怪的问题。在WinMain.cpp中,在我包含用户创建的头文件之后,但是在BEMORE WinMain之后,我声明了我的类Brain的全局实例,如下所示:
(windows includes)
#include "BrainLib.h"
#include "Brain.h"
Brain brain;
(wndproc declaration)
WinMain() {
(some code using Brain)
}
在BrainLib.h
中,我声明了一些常规程序使用的常量,例如const unsigned short SERVER_PORT = 12345;
和const std::string SERVER_IP_STRING = "192.168.1.104";
请注意Brain.h
还包括BrainLib.h
现在它变得有趣了。 Brain包含一个Winsock客户端包装器类,它只能连接到一个服务器。因此,Winsock客户端有一个构造函数需要port / ip而没有默认构造函数。因此,它必须在Brain构造函数初始化列表中初始化,如下所示:
Brain::Brain() : winsockClient( SERVER_PORT, SERVER_IP_STRING )
{
}
但是,调用Brain构造函数时,SERVER_IP_STRING仍然未初始化!我在WinMain中检查了它,并且它在那时被构造,但似乎首先调用了Brain构造函数,即使它看起来是第二个。这是怎么回事?
另外,只是为了让这个陌生人:我复制了源代码并在不同的机器上编译,它按预期工作。在每个版本上运行相同版本的MSVS 2008,但我想可能会使用某种不同的构建设置。
答案 0 :(得分:3)
初始化全局对象的顺序未定义。