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

Chr*_*her 7 c++ namespaces

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

原始C++源码

在啊

#include <unistd.h>
struct File 
{
     void func(int fd);
}; 
Run Code Online (Sandbox Code Playgroud)

在a.cpp

#include "a.h"
void File::func(int fd)
{
    ::close( fd );
}
Run Code Online (Sandbox Code Playgroud)

我添加了这样的命名空间

新啊

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

新的a.cpp

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

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

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

#ifndef 
    #include <header1.h> 
    #include <header2.h>
    ...
#else 
    #include <header3.h>
    #include <header4.h>
    ...
#endif
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢回复.

ald*_*ldo 27

您不应该#include在自己的命名空间中放置指令.你所做的就是将所有内容unistd.h放在命名空间中; 因此,过去(::close()现在应该保留!)现在被宣布为MyAddedNameSpace::close().这不是你想要的.

#include <unistd.h>在.cpp文件顶部添加行的"解决方案" 可以解决问题,但仅限于此.cpp文件.你所做的是以正确的方式包含库头(没有你的命名空间),然后当你的头(啊)被包含时,它#include <unistd.h>再次(这次在你的命名空间内),但这次是该文件中的包含警卫防止它再次被处理.所以对于这个 .cpp文件你没问题,但任何其他文件#include <a.h>都会遇到你原来遇到的同样问题.

可能有一些罕见的情况,你有充分的理由#include在你自己的命名空间中使用,但你很可能会包括一个你自己的标题(或一些其他文件) - 不是库标题! - 即便如此,它可能不是理想的解决方案.

在啊

#include <unistd.h>

namespace MyAddedNameSpace {

struct File
{
  void func(int fd);
};

}
Run Code Online (Sandbox Code Playgroud)

在a.cpp

#include "a.h"

namespace MyAddedNameSpace {

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

}
Run Code Online (Sandbox Code Playgroud)


Tim*_*hko -1

通常将指令放入文件using namespace中就足够了.cpp。像那样:

using namespace MyAddedNameSpace;

    void File::func(int fd)
    {
        close( fd );
    }
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你..