传统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年命名空间"的文章,详细介绍了他有关过渡的建议。
我不知道任何会将std
名称空间折叠到全局的编译器标志,无论如何,这将是一个坏主意-std
比第一次引入时大得多 几乎可以肯定的是,碰撞会碰撞。查看为什么"使用命名空间std"被视为不良练习?
您不太可能与1998年以前标准库的名称相撞,因此应该安全地将这些名称单独拉到全局名称空间。如果您使用预编译的标头,则可以将using
指令放入其中之后,包括定义符号并默默地修复整个项目的标准标头。只需为您遇到的每个编译器错误添加一行。
using std::endl;
using std::set_new_handler;
我只会建议您的目标是在尽可能少的时间和精力中获取代码。更好的长期解决方案仍然是将std::
放在图书馆的所有名称面前。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将单个字符转换为 std::string 前缀 \x01
- 有没有办法在不使用命名空间 std 或前缀 std:: 的情况下引用 cout?
- 在std :: Map或std :: set中找到具有给定前缀的键的优雅方法
- 使用std :: quare_range查找字符串向量中发生的前缀范围
- 传统C 代码不包含std ::前缀
- 任何需要 std:: 前缀的函数
- 应该包含哪些标头才能在 Linux 上的 c++ 代码中保留前缀 std::
- 使用不带前缀"std"且不带"using namespace std;"的 std::sort() 成功编译
- 如何为 std::ostream_iterator 设置前缀
- std::map<tuple<int,int>.lower_bound/upper_bound 前缀搜索,而不找到后缀的最小/最大元素
- 在C++中使用标准 C 函数时,是否需要"std::"前缀?
- 如何对std::index_sequence进行前缀求和
- 使用 std 命名空间,为什么(或为什么不)我应该在 std:: 前面加上前缀
- 解决std::showbase不加零前缀的问题
- 为什么没有std::前缀for_each也能工作
- 我想从这段代码中删除使用命名空间std,但我不确定什么都需要用std::作为前缀