namespaceを複数ソースで使用するとき

[戻る]
Force 2006/06/07(水) 12:40:18
はじめまして。
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は使用していません。

επιστημη 2006/06/07(水) 13:32:42
YES.

Ban 2006/06/07(水) 13:32:54
>単純にB.cppの中にも
>using namespace std;
>という記述を足してあげればいいのでしょうか。
これでかまいません。

共通ヘッダに書く手もありますが、それが本当に内部用のヘッダでないならば、
あまりお勧めはしません。
(せっかくnamespaceを分けたのに、そんなことをするとまた衝突の可能性が増える…

PATIO 2006/06/07(水) 15:41:25
本来は、各々にきちんとstd::と付けるべき所を毎回つけるのは面倒なので
usingを使って楽しているという所だと思います。
なので、必ずしなくてはいけないと言うわけではないと思います。
書く方が面倒で無いなら毎回、クラス名等の前にstd::を付ければいいだけです。
私は最初の頃はなるべくusing namespaceは使わないようにしていました。
どのクラスや定数がどのnamespaceに入っているかを把握出来た方が良いかなと
思っていましたので。

Banさんも書かれていますが、本来はクラス名等の衝突を避ける為に
わざわざnamespaceを使用しているわけですからusingの乱発は避けた方がよいと
思いますよ。

シャノン 2006/06/07(水) 20:03:37
専門学校で C を習った時は、「まず一番最初に #include <stdio.h> を書く。これはお
まじないのようなもの」と言われました(独学で、おまじないではないのは知っていま
したが)。
同じように、C++ では「using namespace std;」が「おまじないのようなもの」として
扱われることが多いかと思われます。
が、ある程度慣れてきたら、ちゃんと意味を理解して、使うべきところと使うべきでな
いところを考えたほうがよいでしょう。

Force 2006/06/07(水) 20:19:17
[[解決]]
みなさま、回答ありがとうございます。

初歩的な手段としてはソースファイルに
using namespace std;
を記述してもよいが、実際には使うべき場所と
使わなくてもよい場所がある、ということでいいのでしょうか。

ちなみに小さなプロジェクトを作って
using namespace std;
を追加せずにstd::で全て書く方法でも
ちゃんとプログラムが動くことを確認しました。
名前空間を宣言しなくても書けるんですね。
勉強になりました。

どうもありがとうございました。

シャノン 2006/06/07(水) 20:51:02
> 実際には使うべき場所と
> 使わなくてもよい場所がある、ということでいいのでしょうか。

逆かなと。
使ってもよい場所と、使うべきでない場所がある、じゃないかな。
使わなくてもよい場所っていうと、全部だし。

> 名前空間を宣言しなくても書けるんですね。

using namespace は名前空間の宣言じゃありません。
正しくは何と呼ぶのかは忘れましたが、std 名前空間の宣言は、STL のヘッダファイル
中で行われています。

PATIO 2006/06/08(木) 11:05:56
using namespaceは、これから使うクラスや定数は特に指定していなければ、
このnamespaceのものを使いますよという意味だったと思います。
特に指定しなければというのが味噌です。
using namespaceは、毎回std::と書けばよいところを楽する為のものです。
なので無くても一向に構いません。
(というか知らなくても毎回std::と書けば良い話なので支障は無いと思います)

まあ、乱暴に言ってしまうと「めんどくさがりや用の機能」かなと。

意味合いは知っておくべきだけど、自分で使う必然は無いと思います。

Ban 2006/06/08(木) 13:45:40
蛇足。

> using namespace は名前空間の宣言じゃありません。
> 正しくは何と呼ぶのかは忘れましたが、std 名前空間の宣言は、
> STL のヘッダファイル中で行われています。

using namespace std; は規格上「using directive」ですね。

類似機能(同一ではない)に「using declaration」というのあったりしますが、
ex.  using std::cin; みたいな奴

namespace difinitionはあれど、namespace自体の宣言のみという構文は特にないです。


# ソレはソレとして、C++ の name lookup は微妙…。

古いスレッドには追加発言できません。