【问题标题】:C++: Questions about using namespace std and cout [duplicate]C++:关于使用命名空间 std 和 cout 的问题 [重复]
【发布时间】:2013-02-27 02:57:02
【问题描述】:

为什么我需要输入using namespace std; 才能使用coutendl?还有这些叫什么; cout 是一个函数吗?

C 中有cout 吗?我听说它是​​用 C++ 实现的,因为它在很多方面都更好。

【问题讨论】:

标签: c++ c cout


【解决方案1】:

cout 是在std 命名空间中定义的全局对象,endl 是也在std 命名空间中定义的(流操纵器)函数。

如果您不采取任何措施将其名称导入全局命名空间,您将无法使用非限定标识符 coutendl 来引用它们。您必须使用完全限定名称:

std::cout << "Hello, World!" << std::endl;

基本上,using namespace std 所做的是将std 命名空间中存在的所有实体名称注入到全局命名空间中:

using namespace std;
cout << "Hello, Wordl!" << endl;

但是,请记住,在全局命名空间中有这样的 using 指令是一种糟糕的编程习惯,这几乎肯定会导致邪恶的名称冲突

如果您真的需要使用它(例如,如果您的某个函数正在使用std 命名空间中定义的许多函数,并且编写std:: 会使代码更难阅读),您应该将其范围限制在单个函数的本地范围内:

void my_function_using_a_lot_of_stuff_from_std()
{
    using namespace std;
    cout << "Hello, Wordl!" << endl;

    // Other instructions using entities from the std namespace...
}

如果可行的话,更好的是使用以下侵入性较小的使用声明,它将选择性地仅导入您指定的名称:

using std::cout;
using std::endl;

cout << "Hello, Wordl!" << endl;

【讨论】:

    【解决方案2】:

    不!您不需要using namespace stdyou shouldn't use it。使用完全限定名称std::coutstd::endl,或者在小范围内,

    using std::cout;
    using std::endl;
    

    至于其他问题,std::cout 不是函数。它是一种绑定到标准输出的全局输出流对象。而且 C 中没有 std::cout

    【讨论】:

    • 如果你没有其他命名空间,或者其他命名空间没有办法干扰std命名空间,可以这样做
    • @BujancaMihai 不,不是。
    • 为什么不呢?假设您没有使用任何其他命名空间。你为什么不应该使用using namespace std;
    • @BujancaMihai 因为您可能不知道std:: 下的所有名称,即使您知道,也无法知道将来版本的 C++ 标准库中将出现的名称。跨度>
    • @BujancaMihai ideone.com/Xpgadi
    【解决方案3】:
    using namespace std;
    

    将名称集合(称为命名空间)中的名称带入当前范围。大多数教科书似乎鼓励如下使用:

    #include <iostream>
    using namespace std;
    
    int main()
    {
         //Code which uses cout, cin, cerr, endl etc.
    }
    

    有些人不鼓励以这种方式使用它,因为当命名空间范围重叠时,您可能会与名称发生意外冲突,并鼓励您直接使用标准名称,如 std::endl

    您还有其他选择,例如

    a) 利用作用域规则临时引入命名空间

    int main()
    {
         {
            using namespace std;
            //Code which uses things from std
         }
         //Code which might collide with the std namespace
    }
    

    b) 或者只带你需要的东西

    using std::endl;
    using std::cin;
    

    回答你的最后一个问题 cin 是一个流对象(支持流提取和插入运算符 >> 和

    【讨论】:

      【解决方案4】:

      cout 和 endl 是 C++ 标准库的成员。如果你想在没有 using 语句的情况下使用它们,只需在命名空间前添加:

      std::cout
      std::endl

      这可能对你有用:

      http://msdn.microsoft.com/en-us/library/bzbx67e8(VS.80).aspx

      cout 在 C 中不存在。

      【讨论】:

        【解决方案5】:

        通常,“使用命名空间标准”仅在小型学习项目中声明,从不在实际程序中声明。原因是您不需要将该命名空间中的所有内容都包含到您的代码中,首先因为编译器需要时间来执行此操作。 Stroustrup 自己写道,这是一种糟糕的品味。 而且它比 C 中的 printf 更好,因为它是类型安全的,并且可以轻松地为您自己的类型重载,而无需更改库类。

        【讨论】:

        • 它不一定比 C 语言中的 printf 更好。速度、内存、缺乏状态改变的操纵器等都是在情况允许的情况下更喜欢 printf 的原因。
        猜你喜欢
        • 2011-03-27
        • 2015-04-24
        • 2011-01-25
        • 1970-01-01
        • 2022-01-11
        • 2015-10-05
        • 1970-01-01
        • 2016-01-11
        • 1970-01-01
        相关资源
        最近更新 更多