Как глобальный объект создается до const, после которого он был объявлен? - PullRequest
0 голосов
/ 19 апреля 2011

Я только что столкнулся со странной проблемой.В 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() : winsockClient( SERVER_PORT, SERVER_IP_STRING )
{
}

Однако SERVER_IP_STRING все еще неинициализирован, когда вызывается конструктор Brain!Я поставил проверку в WinMain, и он был создан в тот момент, но кажется, что конструктор Brain вызывается первым, даже если он появляется вторым.Как / почему это может быть?

Кроме того, просто чтобы сделать это незнакомым человеком: я скопировал исходный код и скомпилировал его на другом компьютере, и он работал как ожидалось.На каждой из них работает одна и та же версия MSVS 2008, хотя, возможно, с какими-то другими настройками сборки.

1 Ответ

3 голосов
/ 19 апреля 2011

Порядок инициализации глобальных объектов не определен.

...