有人知道这是怎么回事吗?
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();
}
}
或者为什么人们会认为第一个是比第二个更好的解决方案?
请注意dllexport
和extern
'关键字'!
答案 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()
调用函数。
子>