c++中使用dllexport的命名空间和标识符

Namespace and identifier in c++ with dllexport

本文关键字:命名空间 标识符 dllexport c++      更新时间:2023-10-16

有人知道这是怎么回事吗

namespace my_ns {
    void Load() {}
}
using namespace my_ns;
extern "C" __declspec(dllexport) void my_dll_function() {
    ::my_ns::Load();
}

namespace my_ns {
    void Load() {}
    extern "C" __declspec(dllexport) void my_dll_function() {
        Load();
    }
}

或者为什么人们会认为第一个解决方案比第二个更好?
请注意dllexportextern的"关键词"!

没有区别(从另一个DLL内的调用者的角度来看),导出的函数名(因为extern "C")没有引用命名空间(您可以使用Dependency Walker检查它)。

这意味着my_dll_function()放在哪里并不重要,它将总是被导入到声明它的名称空间中(与__declspec(dllimport)一起)。这有一个很大的含义:您不能用给定的名称声明多个导出函数(使用extern "C")(即使您尝试在不同的名称空间中声明它们)。来自c++规范(§7.5):

…最多一个具有特定名称的函数可以具有C语言链接。在不同的命名空间作用域中出现的具有相同函数名(忽略限定它的命名空间名称)的C语言链接函数的两个声明引用相同的函数…


子> <只是另一个旁注:在您的第一个示例中,using namespace my_ns是无用的,因为您使用完整的命名空间::my_ns::Load()调用函数。>