带有dllexport的c ++中的命名空间和标识符

时间:2014-05-08 13:39:52

标签: c++ namespaces identifier dllexport

有人知道这是怎么回事吗?

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'关键字'!

1 个答案:

答案 0 :(得分:2)

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

这意味着放置my_dll_function()的位置无关紧要,它总是会在声明它的名称空间中导入(使用__declspec(dllimport))。这有一个很大的含义:你不能声明一个具有给定名称的多个导出函数(带有extern "C")(即使你 - 尝试 - 在不同的命名空间中声明它们)。从C ++规范(第7.5节):

  

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

<小时/> <子> 另一方面注意:在您的第一个示例using namespace my_ns中没用,因为您使用完整名称空间::my_ns::Load()调用函数。