2012-01-20 5 views
2

私はCからC++に移行しています。私が気付いたことは、名前空間のプロトタイプの冗長性です。私は、名前空間の機能を利用して、追加/変更を明確にマークしています。名前空間はプロトタイプ作成メソッドをC++で時代遅れにするのですか?

namespace ns { 
    void sayHello (void); //<-- NOT REQUIRED, BUT IS THERE ANY PURPOSE? 
    void sayHello (void) { 
     std::cout << "Hello world!"; 
     return; 
    } 
} 

int main(int argc, char *argv[]) { 
    ns::sayHello(); 
} 

以前は、Cで、あなたがソースの()メインの「上に」あなたの関数を記述する必要がないようにプロトタイプを持っている良い測定しました。ネームスペースは使用前に定義されなければならないので、ネストされた関数は使用前にも書き込まれます。

私はちょうどC++を開始しています。私は正しいものから始めたいと思います。私はインターネット上でいくつかのチュートリアルを読んできましたが、実際にはこのトピックは言及していません。私はこれが "シンプル"であることを知っていますが、下の投票を控えてコメントを反転してください。誰かができるなら、これが時代遅れであるかどうか、そして/またはシナリオが新しいC++開発者を噛んでしまうかもしれないかどうかについての深い議論に感謝します。

答えて

5

必ずしもそうではありません。宣言と定義はまだ異なる概念です。また、名前空間は複数のファイルにまたがる可能性があり、名前空間に定義する必要はありません。

//test.h 
namespace test 
{ 
    void foo(); 
    //no implementation in header 
} 

//main.cpp 
int main() 
{ 
    test::foo(); 
    return 0; 
} 

//test.cpp 
namespace test 
{ 
    void foo() { }; 
    //definition here 
    //without the definition, we'd get a link error 
} 

C++での実装の分離は、実装の詳細やクリーナーの構造を隠して、(ヘッダで定義を変更するとファイルを含むすべての再コンパイルが必要になります)、より高速なコンパイルをあなたのコードの秘密を保つような理由で行われています。

0

ヘッダファイルと実装ファイルを分割すると、プロトタイプが必要になります。

0

あなたは、例えばで

のように、ヘッダファイルとソースファイル内の定義で宣言を置きますns.h:ns.ccで

namespace ns { 
    void sayHello (void); 
} 

namespace ns { 
    void sayHello (void) { 
     std::cout << "Hello world!"; 
     return; 
    } 
} 

main.ccは:私が正しくあなたの質問を理解している場合

#include "ns.h" 

int main(int argc, char *argv[]) { 
    ns::sayHello(); 
} 
0

私はわかりません。つまり、名前空間は関数の宣言/定義手順を変更しませんでした。名前空間のポイントは、あなたが含んでいるファイルに複数のfoo()がある場合、どのバージョンのfoo()をコンパイラが理解できるかだけです。

作成した例について:宣言の直後に定義を置くと、宣言はもう必要なくなります(定義は宣言としても機能します)。ヘッダーファイルとソースファイルで宣言と定義を分割する場合でも、プロトタイプは必要です。ちなみに、これはあなたのコードを使用する人がヘッダー(コンパイラに関数を呼び出す方法を伝える)をインクルードするだけでよいので、これがお勧めです。定義はリンク時に必要になります。

あなたの質問に少しでもお答えしたいと思います... ;-)

関連する問題