gpt4 book ai didi

c++ - 遗留 c++ 代码不包含 std::prefix

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:07:12 27 4
gpt4 key购买 nike

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

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

最佳答案

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

Herb Sutter 写了一篇名为 Migrating to Namespaces 的文章在 2000 年详细说明了他对转型的建议。

我不知道有任何编译器标志会将 std 命名空间折叠到全局命名空间中,无论如何这都是一个坏主意 - std今天比刚推出时大得多,名称冲突几乎是肯定的。参见 Why is “using namespace std” considered bad practice?

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

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

如果您的目标是在尽可能少的时间和精力内启动并运行代码,我只会建议您这样做。更好的长期解决方案仍然是将 std:: 放在库中所有名称的前面。

关于c++ - 遗留 c++ 代码不包含 std::prefix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47943308/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com