外部"C"与类和 DLL

extern "C" with class and DLL

本文关键字:DLL 外部      更新时间:2023-10-16

我得到了一个使用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有关(:

  1. 既然class不是C语言,这是否等同于一个struct
  2. 构造函数有效吗?
  3. 虚拟析构函数是否有效(因为 C 没有virtual(?
  4. 如何处理bool
  5. 课堂extern "C"内如何对待static
  6. 如何处理extern "C"块内的private数据?
  7. 如何在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 没有这样的东西。