我刚遇到一个奇怪的问题。在WinMain.cpp中,在包含用户创建的头文件之后,但在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。
最佳答案
全局对象的初始化顺序是不确定的。
关于c++ - 如何在声明之后的const之前构造全局对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5710747/