質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

C++ 素朴な疑問 using namespace std; は使わないほうが良い?

mjk
mjk

総合スコア301

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

3回答

0グッド

3クリップ

3901閲覧

投稿2020/08/24 03:24

C++で慣れないと冗長になるSTD::を省略するおまじないとして覚えたusing namespace std;ですが、
どこかで使わないほうが良いと見たことがありそれ以降意識してusing namespace std;を使わないようにしていました。
うろ覚えなので何故使わないほうが良いと思ったのかの理由も忘れてしまっているので再確認したいと思いました。

ネットで検索したコードなどではusing namespace std;を使っているケースが思ったよりも多いので迷っています。
個人的にはvectorの2次元配列などをよく使うので長ったらしいなとは思っていました。

使う環境や制限や個人で使ってる分には好みでどちらでも良いなどの回答になると思いますが後学の為に
「一般的にはどういう扱い」なのか、
「そんなの実務では使わないのが常識だよ」などの温度感が知りたいなと思いました。

※漠然とした質問で恐縮ですがご意見やアドバイスをお聞かせください。

using namespace std;あり

C++

1#include <bits/stdc++.h> 2#define rep(i, m, n) for (int i = m; i < n; ++i) 3 4using namespace std; 5 6int main() { 7 cin.tie(0); 8 ios::sync_with_stdio(false); 9 10 unsigned N, M; 11 vector<vector<unsigned>> vec(N, vector<unsigned>(M, 0)); 12 cin >> N >> M; 13 rep(i, 0, N) { 14 rep(j, 0, N) { cin >> vec[i][j]; } 15 } 16 17 getchar(); 18 return 0; 19}

using namespace std;なし

C++

1#include <bits/stdc++.h> 2#define rep(i, m, n) for (int i = m; i < n; ++i) 3 4int main() { 5 std::cin.tie(0); 6 std::ios::sync_with_stdio(false); 7 8 unsigned N, M; 9 std::vector<std::vector<unsigned>> vec(N, std::vector<unsigned>(M, 0)); 10 std::cin >> N >> M; 11 rep(i, 0, N) { 12 rep(j, 0, N) { 13 std::cin >> vec[i][j]; 14 } 15 } 16 17 getchar(); 18 return 0; 19}

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答3

2

ベストアンサー

「そんなの実務では使わないのが常識だよ」などの温度感が知りたいなと思いました。

趣味で開発しているならコーディングスタイルをどうするかは自由、複数人または組織に属して開発しているなら、そのコーディングスタイルに準拠するということになるとは思います。
とくに決められていないとしたら、実務では使わないほうがいいでしょうね。


どこかで使わないほうが良いと見たことがありそれ以降意識してusing namespace std;を使わないようにしていました。

個人的には goto と同じぐらい使わないほうがいい機能だと思います。
名前空間という機能で区別できるようになっている識別子を using ディレクティブを使ったことで同じ名前空間にインストールされ、名前が衝突したりする可能性が生じます。(例えば、begin という変数を定義していたとしたら、std::begin と衝突する)

using namespace std; の危険性と注意点・代替案【なぜ使わないほうがいいのか】 | MaryCore

例えば、Google のコーディングスタイルでも禁止しています。

Google C++ スタイルガイド(日本語全訳) Google C++ Style Guide (Japanese)

また、usingディレクティブ(using namespace foo)は使ってはいけません。 インライン名前空間も使ってはいけません。 無名名前空間については無名名前空間と静的変数を参照してください。


とはいえ、名前空間が入れ子になっていると長くなる場合があるので、使用するスコープ内で以下のようにすることはたまにやります。

名前のエイリアス作成

cpp

1namespace fs = boost:filesystem;

特定の識別子だけ使えるようにする

using std::cout;

型のエイリアス作成

using SomeType = std::vector<std::pair<<std::string, int>>;

投稿2020/08/24 03:41

編集2020/08/24 03:54
tiitoi

総合スコア21935

mjk, yohhoy👍を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

cateye

2020/08/24 05:42 編集

私も「特定の識別子だけ使えるようにする」ですかね? ーーーーーーーーーーーーーー using std::cerr; using std::cout; using std::endl; こんな感じ・・・使うファイルの冒頭に書いています。
tiitoi

2020/08/24 06:54

コメントありがとうございます。 確かに std::cout、std::endl はデバッグするときに記述頻度が多いので、面倒ですよね。
Zuishin

2020/08/24 07:09 編集

cout は count と間違いやすいので不可派も存在するようです。 https://qiita.com/elipmoc101/items/01003c82dbd2e464a071 C# は using 推奨で、むしろ using しないと使えない LINQ という便利なものもありますが、それで困ったことはありません。名前が衝突したクラスを使おうとした時には必ず警告が出て、あいまいさを無くすよう修正できるし、名前空間をルートから指定できる仕組みもありますから。 逆に言えば、そのような衝突を回避する仕組みを作ることができれば C++ も using を使っていいのではないかと思います。 もし、回避する仕組みがすでにあるのに使ってはいけないという主張が主流なのであれば、もしかしたらその考えは古いのかもしれません。
mjk

2020/08/24 09:02

回答ありがとうございます。 >>実務では使わないほうがいい >>個人的には goto と同じぐらい使わないほうがいい機能だと思います。 >>例えば、Google のコーディングスタイルでも禁止しています。 使わない方が良いことがよくわかりましたしリンク先もとても勉強になります。 他の方の回答にもあった使うものだけ局所的に使うことで冗長さの回避も出来そうです。

1

「使うな」というルールの下でコードを書いているのでないならば,使いたければ使えばよい.
必要なのは「使うと何が問題として起こり得るのか」を把握しておくこと.
起こり得ることを恐れる(?)ならば,質問文内の例のように広範囲に効かせるのではなく,範囲を絞って使うとよい.
(話を把握していれば,ヘッダファイル内に書くような暴挙は控えるようになるだろう.)

C++

1int main(void) 2{ 3 {//この中では"std::"って書きたくない 4 using namespace std; 5 vector<int> V1; //OK 6 } 7 8 vector<int> V2; //NG 9 return 0; 10}

投稿2020/08/24 03:58

fana

総合スコア10785

maisumakun👍を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

fana

2020/08/24 04:06

個人的には, std:: は省略しないですね. 理由はよくわからんですが,"vector" とか "string" とかだけ書かれていると何かキモい. 単に "std::vector" とか "std::string" とかで慣れているからかな? (自分で設けた名前空間を,自分で使う際に「長すぎてめんどくせぇよクソが」ってのはよくある)
fana

2020/08/24 04:22

まぁよっぽど見難くない限り(※「書き難い」ではない)は略さないですね.
mjk

2020/08/24 08:53

回答ありがとうございます。 >>"vector" とか "string" とかだけ書かれていると何かキモい. 確かに自分も慣れてきてたので他人様のコードを拝借させて頂く時にstd::付け直すことがあるのですが違和感がありますね。 >>範囲を絞って使うとよい. これは知りませんでしたので参考にさせていただきます。

0

個人的にはvectorの2次元配列などをよく使うので長ったらしいなとは思っていました。

でしたら、using std::vector;だけ書いておく方法もあります。using namespace std;で何が含まれるかわからない以上、思わぬものを拾ってしまうリスクがあります。


そもそも論ですが、#include <bits/stdc++.h>は標準ヘッダではありませんので、このようなものを実用プログラムには書きません

投稿2020/08/24 03:33

maisumakun

総合スコア142194

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

mjk

2020/08/24 08:56

回答ありがとうございます。 >>そもそも論ですが、#include <bits/stdc++.h>は標準ヘッダではありませんので、このようなものを実用プログラムには書きません。 ですよね。AOJ提出するのに楽なのでこの1行で済ませてる悪い癖だと自負しております。 >>using std::vector;だけ書いておく方法もあります。 別の回答でもありましたが勉強になります。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。