【问题标题】:Should I include header file within a namespace?我应该在命名空间中包含头文件吗?
【发布时间】:2012-04-03 14:27:41
【问题描述】:

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

原始 C++ 源代码

在一个.h

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

在 a.cpp 中

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

我添加了这样的命名空间

新啊.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 添加到编译器抱怨没有声明此类函数的所有函数调用中?

感谢您的回复。

【问题讨论】:

  • #include &lt;unistd.h&gt; 对您的情况没有害处。很明显,&lt;unistd.h&gt;a.cpp 是不可见的。

标签: c++ namespaces


【解决方案1】:

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

using namespace MyAddedNameSpace;

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

希望对你有帮助..

【讨论】:

  • aldo 提供了一个你不应该这样做的充分理由。因为标头保护意味着 unistd.h 每个翻译单元只能包含一次,这意味着您的标头文件的所有用户必须将 unistd.h 放在您的包含之前以进行编译。具有标头排序依赖关系不是一个好主意,也没有需要这样做。
【解决方案2】:

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

您在 .cpp 文件顶部添加行 #include &lt;unistd.h&gt; 的“解决方案”解决了问题,但仅适用于这个 .cpp 文件。你所做的是以正确的方式包含库头(没有你的命名空间),然后当你的头(ah)被包含时,它会再次#include &lt;unistd.h&gt;(这次在你的命名空间内) , 但这次该文件中的包含保护阻止它再次被处理。所以对于 这个 .cpp 文件,你没问题,但任何其他文件 #include &lt;a.h&gt; 都会遇到你最初遇到的同样问题。

在极少数情况下,您可能有充分的理由在自己的命名空间中使用#include,但您很可能会包含您自己的一个头文件(或其他文件)——而不是库头文件! - 即便如此,它也可能不是理想的解决方案。

在一个.h

#include <unistd.h>

namespace MyAddedNameSpace {

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

}

在 a.cpp 中

#include "a.h"

namespace MyAddedNameSpace {

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    相关资源
    最近更新 更多