我应该在命名空间中包含头文件吗?

时间:2012-03-19 03:01:56

标签: c++ namespaces

目前我正在研究一个c框架,我想在其中嵌入一个c ++包。但是,发生了很多命名冲突。所以我决定在C ++源代码中添加一个命名空间。现在的问题是我应该在namespace {}块中移动#include“header.h”吗?我只花了一些时间来弄清楚由以下代码产生的错误。

原始C ++源代码

在a.h

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

在a.cpp中

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

我添加了像这样的名称空间

新的a.h

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

新的a.cpp

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

编译器抱怨:: close()尚未声明。

为什么我将#include指令放在命名空间块中是因为我导入的c ++包也使用#ifndef标志来包含头文件,如下所示。所以我认为简单的方法是将所有代码放在命名空间块{}

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

现在我通过在cpp文件中添加额外的行来解决这个问题

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

但是我不满意这个解决方案,因为unistd.h头已经包含在a.h中,但是在命名空间MyAddedNameSpace中,或者我应该将前缀MyNameSpace添加到编译器抱怨没有声明这样的函数的所有函数调用中?

感谢您的回复。

1 个答案:

答案 0 :(得分:0)

通常只需将指令using namespace放在.cpp文件中即可。 像那样:

using namespace MyAddedNameSpace;

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

希望有所帮助......