我多年没用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中没有.
一般来说,是的,它是向后兼容的.然而,魔鬼在细节中.您可能会发现约定发生变化的情况,或者特定的库会进入或不使用.
NULL是一个宏 - 更喜欢使用0(或C++ 0x中的nullptr).
不确定你的代码有多大,但Visual C++ v6受到限制,导致代码无法在较新的编译器上编译.VS2005及以上版本要好得多(在同期C++标准中更为正确).
不过,我不认为编译旧代码会带来大量工作.我已经从VC6做了一些非常重要的端口 - > VS2005,而且大部分时间都是几个小时,而不是几天.也许一旦文化冲击消退,这似乎并不那么令人生畏.真的,VC++ 10非常好用.
这取决于您要比较的对象。
C++0x 几乎向后兼容 C++03/98。可能有几个不起眼的极端情况发生了变化,但您不太可能遇到它们。然而,在语言首次标准化时发生了很多变化,这意味着 C++98 并不完全(但几乎)与标准前的 C++ 兼容。
但更有可能的是,您所关注的不是 C++ 向后兼容性问题,而只是编译器变得更加严格。他们在遵循标准方面变得更好,并且不再允许许多早期常见的非标准技巧。最有可能的是,您的旧代码从来都不是有效的 C++,而是因为编译器过去常常偏离标准而起作用。