我刚遇到一个奇怪的问题。在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/

10-11 22:23