2012-06-16 2 views
0

Я возился вокруг с возможным способом, чтобы запустить некоторые куски «этот материал должен быть инициализирован при запуске программы» коде, сохраняя при этом их локальными для соответствующих модулей, и пришел с этим:Статические инициализаторы

static struct init { 
    init() { 
     // do stuff 
    } 
} _; 

Когда я положил это в модуль a.cc, он работал нормально. Когда я положил его и в модуль b.cc не очень хорошо - версия А была вызвана дважды, а версия B - совсем не так. Я понял, что ошибка компилятора, он запутывается в двух функциях с тем же именем, но меня удивило то, что при дальнейшем тестировании он ведет себя точно так же в Microsoft C++ и GCC. У обоих компиляторов случается, что у них такая же ошибка, или есть что-то, что мне не хватает в семантике языка?

Кроме того, любые рекомендации по обходным решениям или другим способам достижения одного и того же результата (помимо экспорта соответствующих функций и явного называния их из main, что, очевидно, является резервным)?

+0

связанный: http://stackoverflow.com/q/7437137/430766 – bitmask

ответ

2

В переменные являются статическими и поэтому видны только в соответствующих единицах трансляции, но и типы нет. Как насчет размещения ваших структур в анонимных пространствах имен?

+0

Я думал, что все неназванное пространство имен покупает, это мешает кому-либо изъять его. Почему некоторые случайные cpp имеют видимость типа из другого cpp? – David

+0

Вот как работают * все файлы cpp, @Dave. Как правило, структуры определяются в заголовке, и именно так они гарантированы быть одинаковыми во всех единицах перевода, но нет ничего, что мешало бы вам просто дублировать одно и то же определение в каждом файле отдельно. Компилятор не знает разницы. –

+0

@RobKennedy О, хорошая мысль. Думаю, я никогда об этом не думал. Но в таком случае, почему ситуация с OP не вызывала какую-то ошибку при нарушении ODR? – David