---
slug: namespace-std
lesson: 4
chapter: 1
chapterTitle: 程序
title: using namespace std 到底在干嘛？不写行不行？
description: "std 是 C++ 标准库的名字空间，cout 的全名是 std::cout。using namespace std 表示直接使用 std 中的名字而无需前缀。本课讲清名字空间的作用、不写 using 的正规写法，以及工程实践中不推荐它的原因。"
code: |
  #include <iostream>

  int main() {
      std::cout << "不写 using 也可以" << std::endl;
      return 0;
  }
faq:
  - q: 不写 using namespace std 会怎样？
    a: 程序完全正常，但每次使用标准库的名字都要写全名：std::cout、std::endl、std::string。本课示例就是不写 using 的正规写法，可以直接运行。
  - q: "std:: 是什么意思？"
    a: ":: 是作用域运算符，std::cout 表示「std 这个名字空间中的 cout」。名字空间相当于名字的姓氏，用于避免不同来源的工具重名冲突。"
  - q: 为什么工程实践不推荐 using namespace std？
    a: 它会一次性引入 std 中上千个名字，大型工程中容易与自己定义的名字冲突（标准库中已有 count、find、distance 等常用名）。学习阶段的小程序可以使用；正式项目通常只引入需要的个别名字，如 using std::cout;。
  - q: using namespace std 应该写在什么位置？
    a: 写在所有 #include 之后、main 之前。它的作用范围是从出现位置到当前作用域结束，固定位置书写可以避免一类隐蔽错误。
---

<div class="answer">
cout 的全名是 std::cout——std 是 C++ 标准库的名字空间。
using namespace std 表示：std 中的名字在本文件中直接使用，不再书写前缀。
写它是为了简洁；不写它、每次写 std::cout 也完全正确。本课示例就是不写 using 的版本。
</div>

## 名字空间解决什么问题

cout 并不直接叫 cout，它定义在 **std** 这个名字空间中，全名 `std::cout`。
`::` 是作用域运算符，`std::cout` 即「std 中的 cout」。

名字空间（namespace）解决的是**重名**问题。标准库中有 `count`、`find` 等常用名字，
你自己的程序也可能使用同样的名字。有了名字空间，你的 `count` 与 `std::count` 互不干扰。

## 两种写法都合法

```cpp
#include <iostream>

int main() {
    std::cout << "不写 using 也可以" << std::endl;
    return 0;
}
```

本课示例**不写 using，每次书写全名**——严谨但繁琐，是工程规范的推荐写法。

第 1 课的写法**开头声明 using namespace std，之后直接使用**——简洁，是入门教材的通行写法。
两种写法编译结果完全相同，区别只在书写方式。

## 为什么工程实践不推荐

using namespace std 会一次性引入 std 中的上千个名字。程序规模变大后，
自定义名字一旦与标准库冲突（例如定义自己的 `count`），
编译器会报出难以理解的错误。

折中做法是只引入需要的名字：

```cpp
using std::cout;
using std::endl;
```

入门阶段可以继续使用 using namespace std，但需要明确：**它是便捷的简写，不是必需的语法。**

## 常见错误

- **写在 #include 之前**：此时 std 的内容尚未引入，声明无效；
- **漏写分号**：`using namespace std` 末尾必须有 `;`；
- **namespace 拼错**：namesapce、name space 是高频拼写错误。

下一课：注释——写给人看的文字。
