遗留 c++ 代码不包含 std:: 前缀
Legacy c++ code does not contain std:: prefix
我正在使用 g++ 4.4.7 编译一段非常古老的遗留代码。关于这段代码,我真正知道的是它是在 Irix/Sun 系统上开发的,这意味着它具有 MIPS 体系结构。我在使用这段代码时发现的一件相当奇怪的事情是,它有时会调用 endl
和 set_new_handler
之类的函数而没有 std::
前缀。显然,这会导致编译错误。由于我假设这段代码有时会在某台机器上编译,因此我对盲目添加 std::
前缀使其编译有点谨慎,因为它可能会改变行为。
那么,是否有一些旧的非 ISO 编译器允许这段代码编译?或者是否有某种标志可以传递给 gcc 以允许这段代码工作?
直到 1998 年第一个 ISO/IEC 标准(通常称为 C++98),std
命名空间才被引入 C++。在此之前,所有标准库函数和对象都是全局命名空间的一部分。
赫伯·萨特 (Herb Sutter) 在 2000 年写了一篇名为 Migrating to Namespaces 的文章,详细介绍了他对转型的建议。
我不知道有任何编译器标志会将 std
命名空间折叠到全局命名空间中,无论如何这都是一个坏主意 - std
是 much 今天比首次推出时更大,名称冲突几乎是肯定的。参见 Why is “using namespace std” considered bad practice?
您不太可能与 1998 年之前属于标准库的名称发生冲突,因此 应该 将这些名称单独拉入全局库是安全的命名空间。如果您使用的是预编译头文件,则可以在包含定义符号的标准头文件后将 using
指令放在那里并静默修复整个项目。只需为 运行 遇到的每个编译器错误添加一行。
using std::endl;
using std::set_new_handler;
如果您的目标是在尽可能少的时间和精力内完成并运行设置代码,我只会建议您这样做。更好的长期解决方案仍然是将 std::
放在所有图书馆名称的前面。
我正在使用 g++ 4.4.7 编译一段非常古老的遗留代码。关于这段代码,我真正知道的是它是在 Irix/Sun 系统上开发的,这意味着它具有 MIPS 体系结构。我在使用这段代码时发现的一件相当奇怪的事情是,它有时会调用 endl
和 set_new_handler
之类的函数而没有 std::
前缀。显然,这会导致编译错误。由于我假设这段代码有时会在某台机器上编译,因此我对盲目添加 std::
前缀使其编译有点谨慎,因为它可能会改变行为。
那么,是否有一些旧的非 ISO 编译器允许这段代码编译?或者是否有某种标志可以传递给 gcc 以允许这段代码工作?
直到 1998 年第一个 ISO/IEC 标准(通常称为 C++98),std
命名空间才被引入 C++。在此之前,所有标准库函数和对象都是全局命名空间的一部分。
赫伯·萨特 (Herb Sutter) 在 2000 年写了一篇名为 Migrating to Namespaces 的文章,详细介绍了他对转型的建议。
我不知道有任何编译器标志会将 std
命名空间折叠到全局命名空间中,无论如何这都是一个坏主意 - std
是 much 今天比首次推出时更大,名称冲突几乎是肯定的。参见 Why is “using namespace std” considered bad practice?
您不太可能与 1998 年之前属于标准库的名称发生冲突,因此 应该 将这些名称单独拉入全局库是安全的命名空间。如果您使用的是预编译头文件,则可以在包含定义符号的标准头文件后将 using
指令放在那里并静默修复整个项目。只需为 运行 遇到的每个编译器错误添加一行。
using std::endl;
using std::set_new_handler;
如果您的目标是在尽可能少的时间和精力内完成并运行设置代码,我只会建议您这样做。更好的长期解决方案仍然是将 std::
放在所有图书馆名称的前面。