可视化C++ 使用较新编译器的功能生成供较旧编译器使用的代码
visual C++ Using features of a newer compiler to generate code for use by an older compiler
我一直在研究"较新"C++标准(C++11和C++14)的一些功能,这让我想到了一些事情。我目前正在为我的项目使用 VC++2008 编译器(出于各种原因),这意味着我可以访问的最新标准是 C++03,加上 TR1。TR1 有一些不错的东西,但 C++11 和 C++14 中的一些功能会很好。
我的问题是:有没有办法让我使用较新的编译器(例如 MSVC2012 或 2013)构建一些代码,以使用较新的 C++11 和 C++14 功能构建库或 DLL,然后将其链接到运行 '08 编译器的项目中?
我唯一能想到的行不通的是,在我的 '08 编译器项目中包含的标头中必须有一个 C++11 或 C++14 功能。但是,只要所有"新"都隐藏在我的界面后面,这不应该起作用吗?
是的,但它会变得丑陋..由于ABI不兼容,你必须下降到" extern "C" {}
" ABIness。
这意味着你根本无法传递C++物体......就像我说的,痛苦。这也意味着它必须是 DLL,因为您将无法在静态库中与另一个 ABI 链接。
是否值得在 C API 中包装 DLL 只是为了使用一些新功能,这取决于您,我建议您升级整个项目。
我差点忘了,你可能也无法链接导入库,所以你必须有一些使用 LoadLibrary
、GetProcAddress
和 FreeLibrary
的代码(我有没有提到这很丑陋/痛苦?
不幸的是,您尝试执行的操作无法使用 MSVC。它们故意破坏与每个主要版本的二进制兼容性,如 MSDN 文档中所述:
为了启用新的优化和调试检查,C++标准库的 Visual Studio 实现有意破坏从一个版本到下一个版本的二进制兼容性。因此,使用 C++ 标准库时,不能将使用不同版本编译的对象文件和静态库混合在一个二进制文件(EXE 或 DLL)中,并且C++标准库对象不能在使用不同版本编译的二进制文件之间传递。这种混合会发出有关_MSC_VER不匹配的链接器错误。(_MSC_VER 是包含编译器主要版本的宏,例如,Visual Studio 2013 中 1800 for Visual C++。此检查无法检测 DLL 混合,也无法检测涉及 Visual C++ 2008 或更早版本的混合。
然后,您的选择是仅传递 POD 类型,或者实现 COM 接口以在使用不同版本的 VC 编译器编译的 DLL 之间进行互操作,这两种方法都不是特别可口。
我的建议是,如果你必须坚持使用VS2008来管理某些遗留应用程序,那就吸收它并处理它支持的功能集(至少你有TR1)。对于较新的项目,请尝试说服您的团队使用较新版本的 VC。
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为C++03编译器编写部分unique_ptr,该编译器与较新的编译器在公共代码库上运行
- 与其他编译器相比,相同的代码在工作室Microsoft提供不同的输出
- Visual Studio 中是否有来自代码块的编译器标志的类似物?
- C++ 代码的行为因编译器而异
- 代码未在联机编译器上显示结果
- 在 Azure DevOps 构建管道中使用英特尔C++编译器为 Linux 环境构建C++代码
- 编译器资源管理器(godbolt)如何安全地运行代码?
- 使用特征C++需要哪个代码块编译器?
- GCC 编译器是否应该对涉及 [[fallthrough]] 属性的格式错误的C++代码进行诊断?
- boost::spirit--试图编译大多数简单代码的编译器错误
- 使用其他编译器编译QT代码
- 使用 Mac 终端编译器编译 c++14 代码
- 我最近更改了编译器路径以运行 c++ 代码,但现在我无法运行任何 python 代码。我该如何解决这个问题?
- 编译器是否C++具有相同模板参数集的每个模板类实例生成代码?
- 为什么当我的代码超出函数范围时,"does not name a type"出现编译器错误?
- 如何获得代码::块的C++代码编译器?
- 编译器会自动优化重复代码吗?
- 数字火星编译器(代码::块)无法打开文件'iostream'
- 端口/重新编码真正大和旧的C++编译器代码到Qt或CLI/Mono