Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用于内联映射初始化的动态atexit析构函数崩溃_C++_C++17 - Fatal编程技术网

C++ 用于内联映射初始化的动态atexit析构函数崩溃

C++ 用于内联映射初始化的动态atexit析构函数崩溃,c++,c++17,C++,C++17,我有一个通用的头文件,它将在我的静态库、dll和exe中使用。静态库链接到我的exe和dll。Dll将由exe加载。 对于其中一个需求,我想使用一个全局映射,它将在dll和exe中使用,但我不能,因为头中不允许初始化(得到多个重新定义错误)。所以我使用了C++17的内联特性 在我的头文件中,我声明了这样一个映射 enum class eCategory { eInvalid = 0, eCategory1 = 1, eCategory2, eCategory3,

我有一个通用的头文件,它将在我的静态库、dll和exe中使用。静态库链接到我的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" }
};
enum类eCategory
{
eInvalid=0,
eCategory1=1,
E类别2,
E类别3,
E类别4
};
内联std::映射testCategoryMap{
{eCategory::eCategory1,“Category1”},
{eCategory::eCategory2,“Category2”},
{eCategory::eCategory3,“Category3”},
{eCategory::eCategory4,“Category4”},
{eCategory::eInvalid,“无效”}
};
当我试图执行我的exe时,我在退出析构函数崩溃问题时变得动态。此链接建议我使用atexit(),但不确定如何实现

有人能帮我解决这个问题吗

注意:我刚刚用static替换了inline,并将其添加到名称空间中,它工作得很好。使用静电有什么危害吗

但我只是用static替换了inline,它开始工作了

使用
static
绕过应用程序范围的一个定义规则(ODR)。ODR变为编译单元特定的。这意味着您将有多个
testCategoryMap
实例分布在您的应用程序中,它们都不会相互干扰


仅使用
inline
关键字意味着应用程序范围的一个定义规则不适用。多个编译单元包含相同的头文件是ODR冲突:不需要诊断。当一个应用程序有多个包含该头的编译单元时,它是一个未定义的行为,取决于应用程序是否编译,如果它确实编译,应用程序是否在某个点崩溃是一个未定义的行为。

将在dll和exe中使用的全局映射--您是否使用相同的运行库构建dll和应用程序,如果是,运行库是否为运行库的dll版本?是。我有相同的设置。但我只是用static替换了inline,它开始工作了。