Я только что столкнулся со странной проблемой.В 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, хотя, возможно, с какими-то другими настройками сборки.