可视化C++ 使用较新编译器的功能生成供较旧编译器使用的代码

visual C++ Using features of a newer compiler to generate code for use by an older compiler

本文关键字:编译器 代码 功能 可视化 C++      更新时间:2023-10-16

我一直在研究"较新"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 只是为了使用一些新功能,这取决于您,我建议您升级整个项目。

我差点忘了,你可能也无法链接导入库,所以你必须有一些使用 LoadLibraryGetProcAddressFreeLibrary 的代码(我有没有提到这很丑陋/痛苦?

不幸的是,您尝试执行的操作无法使用 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。