現在、私は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という接頭辞を追加する必要がありますか?
返信いただきありがとうございます。
でa.h
で
は、あなたのケースのための#include ''ても害はありません。 ''は 'a.cpp'には見えません。 –
iammilind
'a.h'から' unistd.h'を削除します – jfs