Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?

Q. C++ で using namespace std; をなぜ避けるのか?

A. 以下のような、「名前空間汚染」と呼ばれる害悪を引き起こすからです。
特に複数人で、比較的大きなコードを書く場合は強く効いてきます。

ここでは、 std を名前空間の例として挙げていますが、std に限りません。

1. std 名前空間に定義されている名前と被った、ユーザー定義型などを安易に使えなくなる

わざとらしい例だと、以下のような感じです。
std::max と、struct max が同じ名前空間で使えなくなります。

#include <algorithm>
#include <iostream>

using namespace std;
struct max {};  // std::max と曖昧

int main(int argc, char *argv[]) {
    int a = max(1, 2);  // error: reference to 'max' is ambiguous
    cout << a << endl;
    return 0;
}

2. 万が一被った名前が定義されると、とても紛らわしい

名前が std のものと被っていると、曖昧だとしてコンパイルが通らなかったりすることも多いです。
ですが、万が一コンパイルが通ったとしても、とても紛らわしいです。

レビュー時や、他の人のコードを読んでいる時に嫌になっちゃいます。
大きなコードベースだと読む気がなくなります。

#include <algorithm>  // std::max
#include <iostream>

using namespace std;

int max(int a, int b) {
    return (a > b) ? a : b;
}

int main(int argc, char *argv[]) {
    int a = max(1, 2);  // こんなコードは嫌だ。動くけど。
    cout << a << endl;
    return 0;
}

3. 将来的に std 名前空間に新たな名前が宣言された時、コンパイルが通らなくなったりする

文字通りです。新しいコンパイラや将来のことを考えながらコードを書くなんて嫌ですよね?

Q. こんなの競プロだと関係なくない? コードを書くのは俺一人だし。

その通りです。

AtCoder は以下のことが前提になっているため、上記のようなことは意識する必要がないか、「自分が注意すればいいじゃん」で済む内容です。

  • 短い時間で
  • 比較的小さなコードを
  • 個人で書く

でも、複数人で協力して、比較的長いスパンで大規模なコードを書くソフトウェア開発だと、これまで説明したことに注意しながらコードを書かなければならないのは、生産性を下げる害悪でしかありません。
なので、「名前空間汚染」を引き起こす言語機能を安易に使うことは、 C++ に限らず(*1) 、良くないプラクティスだとされていると思いますし、規約で禁止していることも珍しくありません(*2)

(*1) たとえば Python とかでも、 from hoge import * とかはわかりやすい最悪のコードです。理由がない限りやりません。
(*2) たとえば Google C++ Style Guide でも、using namespace foo;明確に禁止しています

その他

「名前空間汚染」でググってみると、いろいろ出てくると思います。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment