gpt4 book ai didi

c++ - 带有类和 DLL 的外部 "C"

转载 作者:太空狗 更新时间:2023-10-29 22:55:25 25 4
gpt4 key购买 nike

我看到了使用 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 语言,这是否等同于一个结构?
  2. 构造函数是否有效?
  3. 虚拟析构函数是否有效(因为 C 没有 virtual)?
  4. bool 是如何处理的?
  5. 如何在类的 extern "C" 中处理 static
  6. 如何在 extern "C" block 中处理 private 数据?
  7. noexcept 如何在 extern "C" block 中处理构造函数?

Visual Studio 2017 编译器不会为上述代码生成任何错误或警告。

VS2017 代码分析器只为构造函数生成警告:

C26439 This kind of function may not throw. Declare it 'noexcept' (f.6).

研究:
StackOverflow上与此问题相关的问题中提到“extern "C"具有解决名称重整的作用。但是,它们没有解决virtual的问题,上面列出的 bool`、私有(private)数据等。

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

最佳答案

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

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

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

关于c++ - 带有类和 DLL 的外部 "C",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52261768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com