带有类和DLL的extern“C”

问题描述 投票:3回答:1

我看到了一个使用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. static如何在extern "C"内进行治疗?
  6. 如何在private区块内处理extern "C"数据?
  7. 如何在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 ofvirtual,bool”,私人数据等。

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

c++ visual-studio class dll extern
1个回答
1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.