Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 一个全局对象是如何在它声明之后的常量之前构造的?_C++_Variables_Constructor_Global - Fatal编程技术网

C++ 一个全局对象是如何在它声明之后的常量之前构造的?

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

我刚刚遇到了一个奇怪的问题。在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客户端有一个需要端口/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之间轻松传递。我想我终于学会了另一种选择。谢谢。请注意,只有当它们位于单独的编译单元中时,顺序才未指定。在单个单元中,它们按照定义的顺序进行初始化。