旧版c ++代码不包含std ::前缀

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旧版c ++代码不包含std ::前缀相关的知识,希望对你有一定的参考价值。

我正在使用g ++ 4.4.7编译一个非常古老的遗留代码。我真正了解这段代码的原因是它是在Irix / Sun系统上开发的,这意味着它具有MIPS架构。我在使用这段代码时发现的一个奇怪的事情是它有时会调用像endlset_new_handler这样的函数而没有std::前缀。显然这会导致编译错误。由于我在假设这段代码在某个机器上编译了一段时间,我有点担心盲目添加std::前缀以使其编译,因为它可能会改变行为。

那么,是否有一些旧的非ISO编译器允许这段代码编译?或者是否有某种标志我可以传递给gcc,这将允许这段代码工作?

答案

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

Herb Sutter在2000年写了一篇名为Migrating to Namespaces的文章,详细介绍了他关于过渡的建议。

我不知道任何编译器标志会将std命名空间折叠到全局命名空间中,无论如何它都是一个坏主意 - 今天std比它最初引入时要大得多,并且名称冲突几乎可以肯定。见Why is “using namespace std” considered bad practice?

您不太可能与1998年之前作为标准库一部分的名称发生冲突,因此将这些名称单独提取到全局名称空间中应该是安全的。如果您使用的是预编译头文件,则可以在包含定义符号的标准头文件并以静默方式修复整个项目之后将using指令放在其中。只需为您遇到的每个编译器错误添加一行。

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

如果您的目标是尽可能少地花时间和精力来运行代码,我只会建议您这样做。更好的长期解决方案仍然是将std::放在图书馆的所有名字前面。

以上是关于旧版c ++代码不包含std ::前缀的主要内容,如果未能解决你的问题,请参考以下文章

为什么原始数据类型在不包含System命名空间的情况下工作

具有 C 链接和 C++ 实现的不透明结构

解释'空'C数组(int a = {};)

包含结构的代码有问题,但我不知道为啥(C)

C++11特性之std:call_once介绍

C语言习题如何在 C 中不使用任何分号打印从 1 到 N 的数字?