はじめまして。
C++のnamespaceについて質問があります。
最近C++をはじめ、入門書を読みつつプログラムを
組んでいるのですが、しばしば
using namespace std;
という記述が出てきます。
入門書だとこれはソースファイル(A.cpp)に書かれているのですが、
A.cppと同じプロジェクトに別のソースファイル(B.cpp)があり、
上記の名前空間stdの関数をB.cppで使用したい場合は
どうすればいいのでしょうか。
単純にB.cppの中にも
using namespace std;
という記述を足してあげればいいのでしょうか。
分かりにくい質問で申し訳ありませんが
教えていただけないでしょうか。
環境はWindowsXP Professional VC6 SP6 です。
MFCは使用していません。
YES.
>単純にB.cppの中にも
>using namespace std;
>という記述を足してあげればいいのでしょうか。
これでかまいません。
共通ヘッダに書く手もありますが、それが本当に内部用のヘッダでないならば、
あまりお勧めはしません。
(せっかくnamespaceを分けたのに、そんなことをするとまた衝突の可能性が増える…
本来は、各々にきちんとstd::と付けるべき所を毎回つけるのは面倒なので
usingを使って楽しているという所だと思います。
なので、必ずしなくてはいけないと言うわけではないと思います。
書く方が面倒で無いなら毎回、クラス名等の前にstd::を付ければいいだけです。
私は最初の頃はなるべくusing namespaceは使わないようにしていました。
どのクラスや定数がどのnamespaceに入っているかを把握出来た方が良いかなと
思っていましたので。
Banさんも書かれていますが、本来はクラス名等の衝突を避ける為に
わざわざnamespaceを使用しているわけですからusingの乱発は避けた方がよいと
思いますよ。
専門学校で C を習った時は、「まず一番最初に #include <stdio.h> を書く。これはお
まじないのようなもの」と言われました(独学で、おまじないではないのは知っていま
したが)。
同じように、C++ では「using namespace std;」が「おまじないのようなもの」として
扱われることが多いかと思われます。
が、ある程度慣れてきたら、ちゃんと意味を理解して、使うべきところと使うべきでな
いところを考えたほうがよいでしょう。
みなさま、回答ありがとうございます。
初歩的な手段としてはソースファイルに
using namespace std;
を記述してもよいが、実際には使うべき場所と
使わなくてもよい場所がある、ということでいいのでしょうか。
ちなみに小さなプロジェクトを作って
using namespace std;
を追加せずにstd::で全て書く方法でも
ちゃんとプログラムが動くことを確認しました。
名前空間を宣言しなくても書けるんですね。
勉強になりました。
どうもありがとうございました。
> 実際には使うべき場所と
> 使わなくてもよい場所がある、ということでいいのでしょうか。
逆かなと。
使ってもよい場所と、使うべきでない場所がある、じゃないかな。
使わなくてもよい場所っていうと、全部だし。
> 名前空間を宣言しなくても書けるんですね。
using namespace は名前空間の宣言じゃありません。
正しくは何と呼ぶのかは忘れましたが、std 名前空間の宣言は、STL のヘッダファイル
中で行われています。
using namespaceは、これから使うクラスや定数は特に指定していなければ、
このnamespaceのものを使いますよという意味だったと思います。
特に指定しなければというのが味噌です。
using namespaceは、毎回std::と書けばよいところを楽する為のものです。
なので無くても一向に構いません。
(というか知らなくても毎回std::と書けば良い話なので支障は無いと思います)
まあ、乱暴に言ってしまうと「めんどくさがりや用の機能」かなと。
意味合いは知っておくべきだけど、自分で使う必然は無いと思います。
蛇足。
> using namespace は名前空間の宣言じゃありません。
> 正しくは何と呼ぶのかは忘れましたが、std 名前空間の宣言は、
> STL のヘッダファイル中で行われています。
using namespace std; は規格上「using directive」ですね。
類似機能(同一ではない)に「using declaration」というのあったりしますが、
ex. using std::cin; みたいな奴
namespace difinitionはあれど、namespace自体の宣言のみという構文は特にないです。
# ソレはソレとして、C++ の name lookup は微妙…。