Принудительная инициализация статических переменных в динамически связанных библиотеках

Стандарт C ++ 11 гласит, § 3.6.2, 4:

«Это определяется реализацией, выполняется ли динамическая инициализация нелокальной переменной со статической продолжительностью хранения перед первым оператором main».

Стандарт C ++ отличает статическую инициализацию, которая требует только оценки констант времени компиляции, от динамической инициализации. Я считаю, что наблюдаемые эффекты активной статической инициализации гарантированы. Я заинтересован в нетерпеливой инициализации в любом случае.

Учитывая, что это поведение определяется реализацией и учитывая существующие реализации, существует ли хороший переносимый способ принудительной инициализации? Это решение, принятое компилятором или компоновщиком? Я думаю, что dlopen () с RTLD_NOW дает такое поведение, так что я подозреваю, что это возможно, и что это опция компоновщика.

Чтобы быть конкретным, я хочу динамически связывать библиотеки и иметь конструкторы для глобальных переменных, запускаемых перед main ().

Пример возможного использования можно найти в этом вопросе:

Глобальная переменная C ++ не инициализируется при связывании через статические библиотеки, но в порядке при компиляции с исходным кодом

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

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector