c++ - 关于c++命名约定的问题

标签 c++ winapi dll naming extern

我正在尝试为 win32、mac os、linux、iOs 等平台创建一个抽象层。 我希望它是动态链接的。在不支持这个的平台上,这应该不是问题,因为据我所知,所有可以编译为动态库的东西都可以编译为静态库,并且对代码的影响最小。

现在,进入正题:

我创建了一个名为 IThread 的接口(interface)和一个名为 CThread 的类。我使用一个名为 CreateThread 的函数,该函数用 extern "C"定义,以便能够导出它并在库外调用它。这里的问题是,例如在 win32 中已经有一个名为 CreateThread 的函数,因此我得到一个链接器错误。我了解错误及其出现的原因,但我不确定避免这种情况的好方法。我真的不喜欢使用奇怪的命名,因为 qt 使用像 CreateQtThread。
我的另一个想法是创建一个创建 CThread 实例的线程管理器/工厂,但我不确定这是否是个好主意。

大家怎么看这件事?我问是因为我不想仓促处理像这样的重要组织问题。

非常感谢

最佳答案

I use a function named CreateThread that's defined with extern "C" to be able to export it and call it outside the library.

这很糟糕。我不能谈论其他平台,但在 Windows 上导出 C++ 函数非常好。它们只是被破坏了,你会得到一些完整性检查以防有人更改声明。事实上,这是导出 C++ 函数的唯一正确方法。如果您将它声明为 extern "C",您将得不到 namespace 、没有重载,如果异常从您的函数中逃逸,使用 /EHsc 编译的人将会遇到麻烦。

首选解决方案:不要将它们声明为 extern "C",并将它们放在命名空间中。

唯一的其他解决方案:好吧,猜猜为什么所有这些 C 库都在它​​们的函数前加上 their_lib_prefix_function...

关于c++ - 关于c++命名约定的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7138726/

相关文章:

c++ - 使用 pkg-config 输出将库链接到 QT 项目

c++ - OpenSSL SSL_read 故障

c++ - 如何创建 Qt 组合框

winapi - 我可以获取之前选择的选项卡索引吗

c++ - 使用 IOCTL_CHANGER_GET_PRODUCT_DATA 调用 DeviceIoControl 时出现 ERROR_ACCESS_DENIED

c - gcc 查找已安装的库

c# - 如何从 C# 使用 C++ dll

c++ - 将一些数据写入 Char

c - 使用 LoadLibraryExA(...,...,LOAD_LIBRARY_AS_DATAFILE) 时 GetModuleInformation 失败?

c# - 如何在其所有者进程退出时删除要删除的 DLL?