c++中使用dllexport的命名空间和标识符
Namespace and identifier in c++ with 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();
}
}
或者为什么人们会认为第一个解决方案比第二个更好?
请注意dllexport
和extern
的"关键词"!
没有区别(从另一个DLL内的调用者的角度来看),导出的函数名(因为extern "C"
)没有引用命名空间(您可以使用Dependency Walker检查它)。
这意味着my_dll_function()
放在哪里并不重要,它将总是被导入到声明它的名称空间中(与__declspec(dllimport)
一起)。这有一个很大的含义:您不能用给定的名称声明多个导出函数(使用extern "C"
)(即使您尝试在不同的名称空间中声明它们)。来自c++规范(§7.5):
…最多一个具有特定名称的函数可以具有C语言链接。在不同的命名空间作用域中出现的具有相同函数名(忽略限定它的命名空间名称)的C语言链接函数的两个声明引用相同的函数…
子> <只是另一个旁注:在您的第一个示例中,
using namespace my_ns
是无用的,因为您使用完整的命名空间::my_ns::Load()
调用函数。>
相关文章:
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- CUDA内核和数学函数的显式命名空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- 将以"_[a-z0-9]"开头和"using"的标识符导入全局命名空间是否定义良
- #define 命名空间的标识符中带有 :: (双冒号)
- 错误:标识符"cout"未定义。<iostream> 包含并使用命名空间 std;
- 不同文件中同一命名空间中的 2 个不同枚举中的相同标识符
- 在Boost和Qt库中有哪些命名空间标识符
- 为什么遗留C标识符不需要命名空间std
- c++中使用dllexport的命名空间和标识符
- c++命名空间/标识符问题