外部"C"与类和 DLL
extern "C" with class and DLL
我得到了一个使用extern "C"
的C++DLL源代码:
extern "C"
{
class Something
{
public:
__declspec(dllexport) Something();
__declspec(dllexport) virtual ~Something();
__declspec(dllexport) bool function_one(const char * some_text);
static __declspec(dllexport) char * get_version();
private:
unsigned int m_data;
};
}
DLL 正由C++程序调用。 仅供参考,在Windows 7平台上使用Visual Studio 2017。
问题*(均与extern "C"
和class
有关(:
- 既然
class
不是C语言,这是否等同于一个struct
? - 构造函数有效吗?
- 虚拟析构函数是否有效(因为 C 没有
virtual
(? - 如何处理
bool
?
在 - 课堂
extern "C"
内如何对待static
? - 如何处理
extern "C"
块内的private
数据? - 如何在
extern "C"
块中处理noexcept
构造 函数?
Visual Studio 2017 编译器不会使用上述代码生成任何错误或警告。
VS2017 代码分析器仅为构造函数生成警告:
C26439 This kind of function may not throw. Declare it 'noexcept' (f.6).
研究:
与此问题相关的StackOverflow上的问题提到,"外部"C"has the effect of resolving name mangling. However, they don't address the issues of
虚拟,
布尔值,私有数据等,如我上面列出的。
此外,许多与 DLL 相关的答案建议不要使用非 POD 结构,因为布局可能会在编译器(包括相同版本的编译器(之间发生变化;因此,例如,字符数组优先于std::string
个。
它不会将代码更改为 C。它不会导致C++名称重整 - 因此您不能重载在该块中公开为extern "C"
的函数,例如,但代码仍然C++。
你只是被限制做一些不能从 C 调用的事情(在extern "C"
块中(。您正在公开 C API,但仍可以在后台使用C++。只是不在界面的extern "C"
部分。
这也意味着你不能导出成员函数(virtual
与否(作为extern "C"
,因为 C 没有这样的东西。
相关文章:
- C++:将外部库链接到dll库
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 将 c++ 生成器应用程序与外部 dll 结合使用
- 在Embarcadero C++ Builder中生成的DLL未解决的外部链接错误
- 加载由 MATLAB Coder 生成的带有函数的 DLL,该函数调用外部函数
- 外部"C"与类和 DLL
- 如何将外部 dll 添加到我的 VS2019 项目?
- DLL+导出类+模板成员func=未解析的外部符号.任何修复的机会
- 全局外部指针变量在 DLL 中不可见
- 外部 "C" Visual Studio 2015 中的显式类型错误,DLL 测试代码
- 尝试针对 dll 链接时未解析的外部
- 放置在外部 DLL 中的类中的字符串数据的内存损坏
- 从dll传递c字符串,穿过外部C
- 将 C 中的外部 DLL 追加到 C# 中的 WinForm 项目
- 如何包含具有多个 dll/dylib 的外部(共享)库
- C++ DLL:未解析的外部符号
- 如何调试在外部C#应用中旋转的C DLL(从调试器无法启动)
- 当您的外部SDK仅具有.dll,.lib,.h文件时,如何链接和构建项目
- 未解决的外部符号,带有ftd3xx.dll
- 在VS中编译程序,无需外部运行时DLL