外部 "C" 与 class 和 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;
    };
}

C++ 程序正在调用 DLL。 仅供参考,在 Windows 7 平台上使用 Visual Studio 2017。

问题 *(全部与 extern "C"class 相关):

  1. 因为class不是C语言,这样会不会等同于一个 struct?
  2. 构造函数有效吗?
  3. 虚拟析构函数是否有效(因为 C 没有 virtual)?
  4. 如何处理 bool
  5. static 在 class 的 extern "C" 中如何处理?
  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).

研究:
Whosebug 上与此问题相关的问题提到 "extern "C"has the effect of resolving name mangling. However, they don't address the issues ofvirtual,bool`、私有数据等,如我上面所列。

此外,许多与 DLL 相关的答案建议不要使用非 POD 结构,因为布局可能会在编译器之间发生变化(包括相同版本的编译器);例如,字符数组优于 std::string

它不会将代码更改为 C。它不会导致完成任何 C++ 名称修改 - 因此您不能在该块内重载公开为 extern "C" 的函数,例如,但代码仍然C++。

你只是被限制做一些不能从 C 调用的东西(在 extern "C" 块中)。你公开了一个 C API 但你仍然可以在幕后使用 C++。只是不在您的 extern "C" 界面部分 .

这也意味着您不能将成员函数(virtual 或不)导出为 extern "C" 因为 C 没有这样的东西。