我看到了一个使用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
?virtual
)?bool
是如何处理的?static
如何在extern "C"
内进行治疗?private
区块内处理extern "C"
数据?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"
)导出为qazxswpoi,因为C没有这样的东西。