4

假设我将 C++11 中的代码(我将使用 Lambda)编译为“.o”或库“.a”。而且我有一个程序,我将在其中包含以前的库和头文件,我不能用 C++11 编译,但是旧的 (C++98)。它会编译并正常工作吗?

4

3 回答 3

3

如果出现以下情况,它将正常工作:

  1. (public) 标头不使用任何 C++11 功能
  2. ABI 没有改变
    • 在这方面咨询您的平台/编译器
  3. 没有共同的依赖改变
    • 根据 Vaughn Cato 链接的 GCC 文档,这包括标准库。任何在使用 C++11 编译时生成不同的代码或对象布局并且被库和客户端都使用的东西都可能是一个问题……即使它没有在接口本身中使用。

如果第 3 点是您唯一的问题,您可以通过编译动态库(取决于平台 a .so、或 .dynlib 或 Adrian 建议的 DLL)与所有依赖项在内部静态链接而不是导出来解决它. 虽然有点毛。

于 2013-08-07T13:56:47.803 回答
3

可能不是。c++ 中存在名称修改(ABI 更改的原因)的原因是因为 c++ 版本之间的不兼容差异可能会使代码不稳定,如果它可以工作的话。

如果您的代码不能针对 c++11 进行编译,您可能必须重构您的一个程序才能针对另一个编译器进行编译。(很可能让您的旧代码使用新编译器进行编译)

如果这不是一个选项,您可以尝试使 c++11 库成为具有 C 接口或 COM 对象接口的 DLL,但异常会在该边界处停止,如果您走 DLL 路线,您会很可能想要编写一个包装类来访问 c++11 对象,以便它像边界的 pre c++11 一侧的对象一样工作。

于 2013-08-07T13:37:58.680 回答
2

一种常见的方法是提供 C 版本的 API(extern "C"函数),其中使用不透明指针传递对象。这更有可能在语言和编译器之间兼容。

于 2013-08-07T14:07:46.680 回答