Предупреждение компилятора C5248

раздел "section-name" зарезервирован для динамической инициализации C++. Переменные, которые вручную помещают в раздел, могут быть оптимизированы, и их порядок относительно созданных компилятором динамических инициализаторов не определен

Замечания

Компилятор Microsoft C++ использует зарезервированные имена разделов для внутренней реализации таких функций, как динамическая инициализация C++. Если код вставляет переменную в зарезервированный раздел, например .CRT$XCU, он вмешивается в компилятор. Переменная не считается динамическим инициализатором C++. Кроме того, его относительный порядок инициализации по сравнению с созданными динамическими инициализаторами компилятора не указан.

Чтобы устранить эту ошибку, не создайте раздел, использующий зарезервированное имя или вставьте переменную в зарезервированный раздел.

Нет стандартного способа инициализации переменных в единицах перевода в определенном относительном порядке с созданными динамическими инициализаторами компилятора. Способы принудительной инициализации до или после создания динамических инициализаторов C++ зависят от реализации. Дополнительные сведения о реализации для конкретной корпорации Майкрософт см. в статье О инициализации CRT.

Предупреждение компилятора C5248 новое в Visual Studio 2019 версии 16.11. Он отключен по умолчанию. Дополнительные сведения о включении этого предупреждения см . в предупреждениях компилятора, отключенных по умолчанию.

Пример

Код, который пытается эмулировать поведение компилятора C++ для динамической инициализации часто принимает эту форму:

void f();
typedef void (*type)();

#pragma section(".CRT$XCU", read)
__declspec(allocate(".CRT$XCU")) type i = f;

Этот код создает раздел с помощью зарезервированного имени. .CRT$XCU Он останавливает создание раздела с ожидаемыми свойствами и может пропустить другие инициализации. Переменная i , помещенная в раздел, является обычной переменной и не считается инициализатором компилятором. Компилятор может оптимизироваться i . Относительный порядок при f вызове по сравнению с другими динамическими инициализаторами не определен.

Если порядок инициализации не важен, этот шаблон можно использовать для динамической инициализации переменной при запуске:

void f();

struct init_helper {
    init_helper() { f(); }
};

init_helper i;

См. также

Инициализация CRT