2011-02-24 7 views
17

を使っ++ #includeディレクティブとusing namespaceの違いは何ですか?また、あなたは別のファイルとして自分の名前空間を保存して、このようなファイルのファイル拡張子は何であるのか? C++、#includeC++:Cでの名前空間との#include

+0

Cには名前空間がなく、C++にのみ変更されています。 –

答えて

22

質問に答えるために、少し前に戻ってCとC++の基本を取り上げます。

C/C++をコンパイルするとき、ソースファイルを実際の実行可能ファイルにコンパイルすることは、実際にコンパイルとリンクの2つのステップです。コンパイルのステップでは、一度に1つの.cppファイルを取り込み、これをコンパイルします。他の.cppファイルの内容はコンパイラには表示されません。これは、「オブジェクトファイル」(それは、このようなと呼ばれる理由を私は知らない)を発生します。すべてのオブジェクトファイルはリンカによってリンクされ、最終実行ファイルが生成されます。

これは、C++、宣言および定義の2つの重要な概念をもたらします。宣言は、何か(変数または関数)がどこかに存在することを指定します。以下は、

void Foo(); 

)関数はFoo(の宣言ですこれは、私たちがどこかに引数を取らず、何も値を返さない関数はFoo()があるでしょうコンパイラに言ったことを意味します。

実際にどのような機能が定義されているかの定義。ここで関数は

void Foo() { cout << "Foo!!"; } 

は、バーを別の関数を定義することができます定義されている()

void Bar() { 
    Foo(); 
    cout << "bar"; 
} 

この関数は、関数はFoo()を呼び出します。関数fooがすでに宣言されてのいずれか、または同じファイル内で事前に定義されていない場合、この関数は、コンパイルすることはできません。したがって、宣言はコンパイルされたコードを生成しません。彼らはただそこにいなければなりません。

このファイルに関数Foo()が定義されていないのに、別の.cppファイルが定義されている場合、リンカはこれら2つの関数の間の接続を行います。関数Foo()がどこにも定義されていないと、コンパイラエラーではなくリンカエラーが発生します。

これはヘッダーファイルの概念になります。ヘッダーファイルは、宣言を格納する場所です。 #includeを使用してヘッダファイルの内容をインクルードすると、実際にはプリプロセッサ(実際のコンパイラの前に実行されるステップ)がインクルードされたファイルを読み込み、内容を元のソースファイルにペーストします。したがって、ヘッダファイル全体が実際にC++ファイルに貼り付けられたかのように、コンパイラはファイルを参照します。一方、

名前空間は、単に道には、論理的にグループコードをであるあなたがC++でプログラミングするとき

だから、あなたは、通常の.cppファイルで、あなたの定義を配置します、とあなたは.hファイルであなたの宣言を配置します。

名前空間は別々のファイルには格納されず、特定のファイル拡張子がありません。複数の名前空間を持つプロジェクトがある場合は、名前空間ごとに別々のディレクトリを作成することもできます(状況に応じて再配置することもできます)。

34

は、例えば

(名前空間は、Cには適用されません)namespaceが論理モジュール内にオブジェクトを保持するために使用されている間、あなたのプロジェクトにファイルを追加するために使用され、ファイル内のベクトルクラスを持っているかもしれません「vector.h」あなたはあなたのプロジェクトに含めるようにします。

ベクトルは、大規模なライブラリ(標準ライブラリ)STDの一部であるので、あなたは、プログラマは怠け者だとstd ::すべて上書きしたくないので、しかし

std::vector 

とそれにアクセスすることができます(標準ライブラリには非常に多くの非常に便利な部分があります)、ファイルの先頭に、

using namespace std 

と書くことができます。定義があるかもしれないので、これは名前空間stdにチェックも、毎回それは(このようなベクターなど)のタイプを見て、コンパイラを教えてくれます。このようにして、次の文は同等になります。 vector.hで

std::vector 
vector 

、あなたはとても

namespace std 
{ 
    class vector { /* Implementation */ } 
} 

#includeのようなものが表示されるはずですusing namespaceはあなたのコードクリーナーを維持し、「意味のある」ライブラリにパッケージすることがある一方で、ファイルを追加することです。プログラミング時にusing namespaceを省略することはできますが、絶対に必要とします#include