Dynami c atexit destructor cra sh для инициализации встроенной карты - PullRequest
0 голосов
/ 14 июля 2020

У меня есть общий файл заголовка, который будет использоваться в моих c библиотеках, dll и exe. Stati c lib связана с моими exe и dll. И Dll загрузит exe. Для одного из требований я хотел использовать глобальную карту, которая будет использоваться как в dll, так и в exe, но я не мог, поскольку инициализация не разрешена в заголовке (возникла множественная ошибка переопределения). Итак, я использовал встроенную функцию C ++ 17.

В моем файле заголовка я объявил карту, подобную этой.

enum class eCategory
{
    eInvalid = 0,
    eCategory1 = 1,
    eCategory2,
    eCategory3,
    eCategory4
};


inline std::map<eCategory, std::string> testCategoryMap{
    { eCategory::eCategory1, "Category1" },
    { eCategory::eCategory2, "Category2"},
    { eCategory::eCategory3, "Category3"},
    { eCategory::eCategory4, "Category4" },
    { eCategory::eInvalid, "Invalid" }
};

Когда я пытался выполнить свой exe, я получаю динамический c при выходе деструктора cra sh проблема. Эта ссылка предложила мне использовать atexit (), но не знаю, как это реализовать.

Может ли кто-нибудь помочь мне решить эту проблему.

Примечание: я просто заменил inline на stati c и добавил его внутри пространства имен, и он работает нормально. Любой вред при использовании stati c?

1 Ответ

1 голос
/ 14 июля 2020

Но я просто заменил inline на stati c, и он начал работать.

Использование static обходит правило One Definition Rule (ODR) для всего приложения. Вместо этого ODR становится спецификацией единицы компиляции c. Это означает, что в вашем приложении будет несколько экземпляров testCategoryMap, распределенных по всему приложению, ни один из которых не мешает друг другу.

Использование только ключевого слова inline означает, что правило One Definition Rule для всего приложения действительно применяется. Наличие нескольких единиц компиляции, включающих один и тот же файл заголовка, является нарушением ODR: Диагностика не требуется c не требуется . Когда приложение имеет несколько единиц компиляции, которые включают этот заголовок, это не определенное поведение, которое поднимается независимо от того, строится приложение или нет, а если оно все же строится, это неопределенное поведение, вызывающее сбой приложения в какой-то момент.

...