Здравствуйте, Mechanicus, Вы писали:
M> module.cpp
M> M> . . .
M> Module::worldFactory_t Module::worldFactory_;
M> . . .
M>
M> module.h
M> M> . . .
M> class Module
M> {
M> public:
M> static bool registerWorld(World *(*createFn)())
M> {
M> std::cout << "World is registered." << std::endl;
M> worldFactory_ = createFn;
M> return true;
M> }
M> . . .
M>
M> world.cpp
M> M> . . .
M> static bool world_registered = Module::registerWorld(create);
M> . . .
M>
M> При компиляции с помощю mingw(gcc-3.3.1) и выполнении
M> этой программы стабильно на cout выдаётся World is registered.
M> call to empty boost::function
M> done.
Подозреваю, что сначала вызывается registerWorld, а
затем — конструктор
boost::function для объекта Module::worldFactory_, что приводит к обнулению
указателя, в нем содержащегося.
M> VC7.0 всё компилит и выполняет нормально. Я даже не знаю кто тут прав, вроде
M> код верный, и VC прав, хотя кто его знает.
Оба правы: стандарт не гарантирует порядок инициализации глобальных объектов в
разных единицах трансляции.
Для решения можно, например, заменить статическую переменную-член worldFactory_
на статическую функцию вида:
/* static */
Module::worldFactory_t& Module::worldFactory_()
{
static Module::worldFactory_t theFactory;
return theFactory;
}
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен