新C++是否向后兼容

Ala*_*irG 9 c++

我多年没用C++编写代码了.我最近发现,在那些年里它发生了巨大变化.我不确定我是否喜欢这些变化,但这是另一个讨论.

我仍然有一些C++代码敲我的硬盘.如果我把它拿出来并尝试用一个不错的新C++编译器编译它,比如说最新版本的g ++,它会编译吗?没有警告(假设它之前没有警告编译)?

最近我确实搞乱了一些VC++ 2010,并发现了一些我期望工作的东西不起作用,并且当我尝试使用NULL时根据上下文得到不同的消息.但是在该代码的一部分中,我使用NULL甚至没有警告.

sha*_*oth 13

这取决于.通常,较新的编译器更符合标准,因此在早期编译器上编译的许多构造在没有修复的情况下现在无法编译.例如:

 for( int i = 0; ... );
 i++;
Run Code Online (Sandbox Code Playgroud)

在Visual C++ 7中编译,但在Visual C++ 9中没有.

  • 因此C++本身是向后兼容的,但实现它的编译器却不是. (7认同)
  • @Billy ONeal:标准只是一个文本而且有编译器是工作程序.很少有人按照标准写作 - 一旦它与一个或多个感兴趣的编译器一起工作,它们通常会解决.这就是真正的代码几乎从未完全符合标准的原因. (3认同)
  • @Dialecticus:因此,如果您使用非标准编译器扩展或利用编译器错误,那么新版本的编译器可能会破坏您的代码.这几乎是一个给定的因为它是非标准的行为!另一方面,如果您的代码是正确的,那么开始的标准不应该有这样的问题. (2认同)

Dav*_*ill 8

一般来说,是的,它是向后兼容的.然而,魔鬼在细节中.您可能会发现约定发生变化的情况,或者特定的库会进入或不使用.

  • 最近,当一个类在使用新的 C++ 时开始需要移动构造函数才能正确运行时,我尝到了“细节中的魔鬼”的滋味。否则,程序会在使用新功能的 C++0x STL 代码中崩溃。 (2认同)

Ste*_*end 7

NULL是一个宏 - 更喜欢使用0(或C++ 0x中的nullptr).

不确定你的代码有多大,但Visual C++ v6受到限制,导致代码无法在较新的编译器上编译.VS2005及以上版本要好得多(在同期C++标准中更为正确).

不过,我不认为编译旧代码会带来大量工作.我已经从VC6做了一些非常重要的端口 - > VS2005,而且大部分时间都是几个小时,而不是几天.也许一旦文化冲击消退,这似乎并不那么令人生畏.真的,VC++ 10非常好用.

  • @Javier:C是弱类型的,你可以将`(void*)0`分配给任何指针.在C++中,这需要显式转换.因此,如果已经为C定义了宏,那么它可能会在C++程序中中断. (2认同)

jal*_*alf 5

这取决于您要比较的对象。

  • Visual Studio 2010 部分实现了即将发布的 C++0x 草案(最近版本的 GCC 也实现了该草案的一个子集,预计明年将标准化)
  • C++98/C++03 是 C++ 的第一个标准化版本,并且仍然是官方版本(因为 C++0x 仍然只是一个草案)
  • 当然,还有语言标准化之前的方言

C++0x 几乎向后兼容 C++03/98。可能有几个不起眼的极端情况发生了变化,但您不太可能遇到它们。然而,在语言首次标准化时发生了很多变化,这意味着 C++98 并不完全(但几乎)与标准前的 C++ 兼容。

但更有可能的是,您所关注的不是 C++ 向后兼容性问题,而只是编译器变得更加严格。他们在遵循标准方面变得更好,并且不再允许许多早期常见的非标准技巧。最有可能的是,您的旧代码从来都不是有效的 C++,而是因为编译器过去常常偏离标准而起作用。