C++ 一个全局对象是如何在它声明之后的常量之前构造的?
我刚刚遇到了一个奇怪的问题。在WinMain.cpp中,在包含用户创建的头文件之后,但在WinMain之前,我声明了类Brain的全局实例,如下所示:C++ 一个全局对象是如何在它声明之后的常量之前构造的?,c++,variables,constructor,global,C++,Variables,Constructor,Global,我刚刚遇到了一个奇怪的问题。在WinMain.cpp中,在包含用户创建的头文件之后,但在WinMain之前,我声明了类Brain的全局实例,如下所示: (windows includes) #include "BrainLib.h" #include "Brain.h" Brain brain; (wndproc declaration) WinMain() { (some code using Brain) } 在BrainLib.h中,我声明了一些常量供一般程序使用,例如cons
(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客户端有一个需要端口/ip的构造函数,而没有默认构造函数。因此,它必须在Brain构造函数初始化列表中进行初始化,如下所示:
Brain::Brain() : winsockClient( SERVER_PORT, SERVER_IP_STRING )
{
}
然而,当调用Brain构造函数时,服务器IP字符串仍然未初始化!我在WinMain中做了一个检查,它是在那个点上构造的,但是看起来好像大脑构造函数是第一个被调用的,尽管它是第二个。这怎么可能
还有,让我更奇怪的是:我复制了源代码并在另一台机器上编译,它按照预期工作。每个服务器上运行的MSVS 2008版本相同,虽然我认为可能是使用某种不同的生成设置。全局对象的初始化顺序未定义。全局对象的初始化顺序未定义。您是否在非工作编译器版本中将服务器IP\u字符串
声明为常量字符串
?哦,对不起,是的,这两个服务器变量都声明为const!真不敢相信我漏掉了。已编辑。并且工作版本具有完全相同的源代码。您是否在非工作编译器版本中将SERVER\u IP\u STRING
声明为const STRING
?哦,对不起,是的,两个服务器变量都声明为const!真不敢相信我漏掉了。编辑。工作版本有完全相同的源代码。真的吗?这是最愚蠢的事情让我抓狂。你知道如何使我的代码始终工作吗?最好的办法是避免使用全局变量,而是将它们封装在函数中。我确实尝试避免全局变量,但通常每个程序使用一个全局变量,以便在WinMain/WndProc之间轻松传递。我想我终于学会了另一种选择。谢谢。请注意,只有当它们位于单独的编译单元中时,顺序才未指定。在一个单元中,它们按照定义的顺序进行初始化。真的吗?这是最愚蠢的事情让我抓狂。你知道如何使我的代码始终工作吗?最好的办法是避免使用全局变量,而是将它们封装在函数中。我确实尝试避免全局变量,但通常每个程序使用一个全局变量,以便在WinMain/WndProc之间轻松传递。我想我终于学会了另一种选择。谢谢。请注意,只有当它们位于单独的编译单元中时,顺序才未指定。在单个单元中,它们按照定义的顺序进行初始化。