【问题标题】:What is the need to specify "std" prefix?什么是需要指定“std”前缀?
【发布时间】:2011-07-11 12:36:46
【问题描述】:

我是编程的初学者,我经常看到许多程序使用前缀std,如果他们使用任何std 函数,如std::coutstd::cin 等。我想知道它的目的是什么?它只是一种良好的编程方式还是还有更多?它对编译器有什么影响,还是可读性?谢谢。

【问题讨论】:

标签: c++ std


【解决方案1】:

没有人在他们的回答中提到 using namespace foo 语句可以放在函数体内,从而减少其他范围内的命名空间污染。

例如:

// This scope not affected by using namespace statement below.

void printRecord(...)
{
    using namespace std;
    // Frequent use of std::cout, io manipulators, etc...
    // Constantly prefixing with std:: would be tedious here.
}

class Foo
{
   // This scope not affected by using namespace statement above.
};

int main()
{
   // This scope not affected either.
}

您甚至可以将using namespace foo 语句放在本地范围内(一对花括号)。

【讨论】:

    【解决方案2】:

    STL 类型和函数在名为std 的命名空间中定义。 std:: 前缀用于使用不完全包含 std 命名空间的类型。

    选项1(使用前缀)

    #include <iostream>
    
    void Example() {
      std::cout << "Hello World" << std::endl;
    }
    

    选项 #2(使用命名空间)

    #include <iostream>
    using namespace std;
    
    void Example() {
      cout << "Hello World" << endl;
    }
    

    选项 #3(单独使用类型)

    #include <iostream>
    using std::cout;
    using std::endl;
    
    void Example() {
        cout << "Hello World" << endl;
    }
    

    注意:除了不必在每个类型/方法前面加上 std::(尤其是在头文件中完成时)之外,包含整个 C++ 命名空间(选项 #2)还有其他含义。许多 C++ 程序员避免这种做法,而更喜欢 #1 或 #3。

    【讨论】:

    • @Erik 那是我想出的另一个选择。我会明确的
    • 我要指出的是,你永远不应该在你的头文件中包含整个命名空间。它也将包含在用户的源代码中(包括您的标题),这不是您想要的。
    • @Dadam,我的回答的最后一段指出它的 #2 不应该在标题中完成
    • 请注意#3 是函数(模板)std::swap 的首选,因为using std::swap; swap(a,b); 是确保您获得 ADL 重载的方法 swap(如果存在),而且很无聊std::swap 如果没有。 std::swap 可以一次专门用于用户定义的类,但对于用户定义的类模板,ADL 是提供自定义交换的唯一合法方式。不过,移动语义可以让这个问题消失,也许这种使用std::swap 的方式可以在 C++0x 中改变。
    • 与其称其为“STL”,正确的术语是“C++ 标准库”。 (实际的 STL 是旧的、过时的,并且与标准不兼容,并且 std 命名空间中的某些东西不在 STL 中。)
    【解决方案3】:

    标准命名空间的简称。

    你可以使用:

    using namespace std
    

    如果你不想继续使用 std::cout 而只使用 cout

    【讨论】:

    • 我不同意这里。 std:: 优于 using namespace std
    • 如果你“通常”使用这个,请停止。请参阅@Erik 的回答。
    • 好吧,“通常”这个词不合适。把它改成我的意思。
    【解决方案4】:

    C++ 有命名空间的概念。

    namespace foo {
      int bar();
    }
    
    namespace baz {
      int bar();
    }
    

    这两个函数可以共存而不冲突,因为它们位于不同的命名空间中。

    大多数标准库函数和类都位于“std”命名空间中。访问例如cout,您需要按照优先顺序执行以下操作之一:

    • std::cout &lt;&lt; 1;
    • using std::cout; cout &lt;&lt; 1;
    • using namespace std; cout &lt;&lt; 1;

    您应该避免使用using 的原因已通过上述 foo 和 baz 命名空间进行了说明。如果您有using namespace foo; using namespace baz;,那么任何尝试调用bar() 都是模棱两可的。使用命名空间前缀是明确而准确的,是一个好习惯。

    【讨论】:

      【解决方案5】:

      这是一个名为命名空间的 C++ 功能:

      namespace foo {
         void a();
      }
      
      
      // ...
      
      foo::a();
      
      // or:
      
      using namespace foo;
      a(); // only works if there is only one definition of `a` in both `foo` and global scope!
      

      优点是,可能有多个名为a 的函数——只要它们位于不同的命名空间中,就可以明确地使用它们(即foo::a()another_namespace::a())。为此,整个 C++ 标准库位于 std 中。

      使用using namespace std; 来避免前缀,如果你能忍受缺点(名称冲突,不太清楚函数属于哪里,...)。

      【讨论】:

        猜你喜欢
        • 2013-05-14
        • 1970-01-01
        • 2011-09-22
        • 1970-01-01
        • 1970-01-01
        • 2015-05-10
        • 1970-01-01
        • 1970-01-01
        • 2016-09-07
        相关资源
        最近更新 更多