带类和DLL的外部“ C”

时间:2018-09-10 16:12:33

标签: c++ visual-studio class dll extern

我看到了一个使用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内如何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问题提到了上面列出的“外部” C” has the effect of resolving name mangling. However, they don't address the issues of虚拟,布尔,私有数据等。

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

1 个答案:

答案 0 :(得分:1)

它不会将代码更改为C。它不会导致C ++名称修改发生-因此,例如,您不能在该块内重载显示为extern "C"的函数,但是代码仍然是C ++。

您仅被限制执行无法从C调用的操作(在extern "C"块中)。您正在公开C API,但仍可以在后台使用C ++。只是不在您的extern "C"接口的部分中。

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