传统C 代码不包含std ::前缀

Legacy c++ code does not contain std:: prefix

本文关键字:std 前缀 包含 代码 传统      更新时间:2023-10-16

我正在用G 4.4.7编译非常旧的旧代码。我真正知道的这一代码是在IRIX/SUN系统上开发的,这意味着它具有MIPS架构。我在使用此代码时发现的一件事是,它有时会调用像endlset_new_handler一样无std::前缀的功能。显然,这导致汇编误差。由于我在某个时候在某些机器上编译了该代码的假设工作,因此我对盲目添加std::前缀进行编译有些警惕,因为它可能会改变行为。

那么,是否有一些旧的非ISO编译器可以允许此代码编译?还是我可以将某种标志传递给GCC,可以使该代码工作?

直到1998年的第一个ISO/IEC标准(通常称为C 98)之前,std名称空间才引入C 。在此之前,所有标准库功能和对象都是全局名称空间的一部分。

Herb Sutter写了一篇名为"迁移到2000年命名空间"的文章,详细介绍了他有关过渡的建议。

我不知道任何会将std名称空间折叠到全局的编译器标志,无论如何,这将是一个坏主意-std比第一次引入时大得多 几乎可以肯定的是,碰撞会碰撞。查看为什么"使用命名空间std"被视为不良练习?

您不太可能与1998年以前标准库的名称相撞,因此应该安全地将这些名称单独拉到全局名称空间。如果您使用预编译的标头,则可以将using指令放入其中之后,包括定义符号并默默地修复整个项目的标准标头。只需为您遇到的每个编译器错误添加一行。

using std::endl;
using std::set_new_handler;

我只会建议您的目标是在尽可能少的时间和精力中获取代码。更好的长期解决方案仍然是将std::放在图书馆的所有名称面前。