我得到了一个 C++ DLL 源代码,它使用extern "C"
:
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"
and class
):
- Since
class
不是C语言,这相当于struct
?
- 构造函数有效吗?
- 虚拟析构函数是否有效(因为 C 没有
virtual
)?
- 怎么样
bool
处理?
- How is
static
内处理extern "C"
为了班级?
- How is
private
内部处理的数据extern "C"
block?
- How is
noexcept
处理在extern "C"
块为
构造函数?
Visual Studio 2017 编译器不会使用上述代码生成任何错误或警告。
VS2017代码分析器仅对构造函数生成警告:
C26439 This kind of function may not throw. Declare it 'noexcept' (f.6).
研究:
StackOverflow 上与此问题相关的问题提到“extern “C”has the effect of resolving name mangling. However, they don't address the issues of
virtual,
bool`、私有数据等,如我上面列出的。
另外,许多 DLL 相关的答案建议不要使用非 POD 结构,因为编译器之间的布局可能会发生变化(包括相同版本的编译器);例如,字符数组优于std::string
.
它不会将代码更改为 C。它不会导致执行任何 C++ 名称修改 - 因此您不能重载公开为的函数extern "C"
例如,在该块内,但代码仍然是 C++。
你只是被限制不能做那些不能从 C 调用的事情(在extern "C"
堵塞)。您正在公开 C API,但您仍然可以在幕后使用 C++。只是不在你的extern "C"
界面的一部分.
这也意味着您不能导出成员函数(virtual
或不)作为extern "C"
因为C没有这样的东西。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)