2010-10-06 2 views
2

У меня есть код, как это:инициализация константных переменных

bool doSomething() 
{ 
    std::cout << "I'm here!" 
    return true; 
} 
const bool x = doSomething(); 

Если поместить в CPP-файл в моем консольного приложения Visual C++, код выполняется, как ожидается, перед входом в метод Main().

Однако, если я поместил этот код в .cpp-файл в проект статической библиотеки ссылок (который связан с моим консольным приложением), код никогда не будет выполнен. Я не определяю какие-либо методы в этом файле, которые используются извне, нет соответствующего файла .h. Возможно ли, что компоновщик не связывает файл? Как я могу избежать этого?

(Фактически код запускается, если я создаю файл заголовка для файла cpp, поместите другой метод «void dummy() {}» внутри cpp- и h-файла и вызывают фиктивный() из основного.)

Спасибо большое!

ответ

5

Это должно привести к прямым вещам.

$ 3.6.2/4 «Это определяется реализацией ли сделали динамическая инициализация нелокального переменной со статической продолжительностью хранения перед первым оператором главного. Если инициализация является отложено до какой-то момент времени после того, как первое заявление главного, оно должно происходить перед первым использованием любого функции или переменной, определенной в же единице трансляции в качестве переменной быть initialized.34"

1

Когда код находится в статической библиотеке, компоновщик свяжет его только в том случае, если он действительно используется. Это уменьшает размер вашего двоичного файла.

+0

Хорошо, это нормально, но мой метод doSomething() на самом деле что-то делает (как говорит название :-)). В моем конкретном случае он регистрирует тип на фабрично-синглетоне, который используется из других частей. Таким образом, эта «оптимизация» приводит к изменению поведения. Это нормально? – Philipp

+1

Это не нормально, но линкер не знает, что вы хотите, чтобы этот код исполнялся в клиенте библиотеки. Было бы лучше использовать какой-то альтернативный метод, чтобы разоблачить этот необходимый вызов, когда клиент должен каким-то образом инициировать библиотечную инициализацию, путем внешней ссылки на этот код, который заставляет его тянуть на этапе ссылки. –

Смежные вопросы