2012-03-19 17 views
4

現在、私はCフレームワークに取り組んでおり、その中にC++パッケージを埋め込みたいと思っています。しかし、多くの名前の競合が発生します。だから私はC++ソースに名前空間を追加することに決めました。これで、namespace {}ブロック内の#include "header.h"を移動する必要がありますか?私はちょうど次のコードから生じたバグを理解するために少し時間を費やしました。名前空間内にヘッダファイルを含めるべきですか?

a.hでオリジナルC++ソース

#include <unistd.h> 
struct File 
{ 
    void func(int fd); 
}; 
a.cppで

#include "a.h" 
void File::func(int fd) 
{ 
    ::close(fd); 
} 

そして私は

namespace MyAddedNameSpace 
{ 
    #include <unistd.h> 
    struct File 
    { 
     void func(int fd); 
    }; 
} 
a.hこの

新しいのように名前空間を追加しました

新a.cpp

#include "a.h" 
namespace MyAddedNameSpace 
{ 
    void File::func(int fd) 
    { 
     ::close(fd); 
    } 
} 

とコンパイラこと::近い(文句)が宣言されていません。私は、インポートC++パッケージには、次のようにヘッダファイルを含めるように#ifndefのフラグを使用するので、私は名前空間のブロック内の#includeディレクティブを置くのはなぜ

理由があります。だから私は今、私は

#include <unistd.h> //new added line 
#include "a.h" 
namespace MyNameSpace 
{ 
    void File::func(int fd) 
    { 
     ::close(fd); 
    } 
} 

のcppファイル内の余分な行を追加することで、この問題を解決しかし、私はこれで満足していない簡単な方法は、名前空間のブロック{}

#ifndef 
    #include <header1.h> 
    #include <header2.h> 
    ... 
#else 
    #include <header3.h> 
    #include <header4.h> 
    ... 
#endif 

内のすべてのコードを置くことだと思いますソリューションはunistd.hヘッダーがすでにAhに含まれていますが、MyAddedNameSpaceという名前空間内に含まれているか、またはコンパイラがこのような関数を宣言していないと不平を言うすべての関数呼び出しにMyNameSpaceという接頭辞を追加する必要がありますか?

返信いただきありがとうございます。

+0

でa.h

#include <unistd.h> namespace MyAddedNameSpace { struct File { void func(int fd); }; } 

は、あなたのケースのための#include ''ても害はありません。 ''は 'a.cpp'には見えません。 – iammilind

+0

'a.h'から' unistd.h'を削除します – jfs

答えて

0

通常は.cppファイル内のディレクティブusing namespaceを配置するのに十分です。そのような :

using namespace MyAddedNameSpace; 

    void File::func(int fd) 
    { 
     close(fd); 
    } 

は、あなたがあなた自身の名前空間内の#includeディレクティブを置くべきではありません

+0

これは動作します。ありがとう – Christopher

+0

私の喜び!あなたは私の答えを緑の "V"を押して受け入れることができます。あなたの次の質問とあなたの料金にはいいです。 –

+0

aldo prividesなぜこれをしてはならないのか?ヘッダーガードは、unistd.hが翻訳単位ごとに1回しか含まれないことを意味するので、ヘッダーファイルのすべてのユーザーは、コンパイルのためにインクルードする前にunistd.hを配置する必要があります。ヘッダーの順序依存性を持つことはお勧めできません。また、これを行う必要もありません。 –

19

...それがお役に立てば幸いです。あなたがしたことは、unistd.hのすべての内容をあなたの名前空間の中に置くことです。したがって、今までであったものは、::close()としてMyAddedNameSpace::close()と宣言されました。これはあなたが望むものではありません。

.cppファイルの先頭に「#include <unistd.h>」という行を追加する「解決策」は、この1つの.cppファイルに対してのみ問題を修正します。あなたは(あなたの名前空間なし)ライブラリのヘッダに正しい道を含まれてやった、とあなたのヘッダが(ああ)含まれているときに、それは再び(あなたの名前空間内でこの時間)を#include <unistd.h>を行いますが、今回は、インクルードには警備員が含まれますそのファイルには、それが再び処理されないようにします。だから、この .cppファイルのためにあなたはOKだが、#include <a.h>を行い、他のファイルには、もともと持っていた同じ問題を持っています。

#includeを自分のネームスペース内で使用する正当な理由があるかもしれませんが、あなた自身のヘッダー(または他のファイル)を含む可能性があります。それでも、それはおそらく理想的な解決策ではありません。 a.cpp

#include "a.h" 

namespace MyAddedNameSpace { 

void File::func(int fd) 
{ 
    ::close(fd); 
} 

} 
+0

あなたの答えはより明確です。私は理由を知りたい。ありがとうございました。 –

関連する問題