gpt4 book ai didi

c++ - c++ 中的命名空间和标识符与 dllexport

转载 作者:太空狗 更新时间:2023-10-29 21:43:12 27 4
gpt4 key购买 nike

有人知道吗

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 检查它沃克)。

这意味着 my_dll_function() 放在哪里并不重要,它将始终导入到声明它的命名空间中(使用 __declspec(dllimport))。这在某种程度上具有重大意义:您不能使用给定名称声明多个导出函数(使用 extern "C")(即使您 - 尝试 - 在不同的命名空间中声明它们)。来自 C++ 规范(§ 7.5):

...At most one function with a particular name can have C language linkage. Two declarations for a function with C language linkage with the same function name (ignoring the namespace names that qualify it) that appear in different namespace scopes refer to the same function...


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

关于c++ - c++ 中的命名空间和标识符与 dllexport,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23543453/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com