我们应该将#include移动到命名空间吗?

时间:2012-03-29 15:57:41

标签: c++

  

可能重复:
  Is it a good idea to wrap an #include in a namespace block?

// Method One
#ifndef XXX_H
#define XXX_H
#include <iostream>
#include "myhead.h"
namespace XXX
{
    /...
}
#endif

OR

// Method Two
namespace XXX
{
#ifndef XXX_H
#define XXX_H

    #include <iostream>
    #include "myhead.h"
    /...
#endif
}

当我们定义新的namespace XXX时,我们是否应该在命名空间内移动#include directive

谢谢

4 个答案:

答案 0 :(得分:6)

您必须在您的命名空间中包含<iostream>。您将收到链接器错误。

我不建议在命名空间中包含任何标头。

唯一的例外是你有一个只定义extern "C"函数的头文件(没有C ++函数或类),你通常可以在命名空间中包含它而不会导致链接器问题。但它仍然可能不是一个好主意。

答案 1 :(得分:2)

这取决于你想要什么,因为两者都不相同。他们每个人都有不同的意思。

如果将它们包含在命名空间内,则heades将在命名空间内扩展,这意味着标题中的所有名称都将在命名空间内声明/定义,在您的情况下为XXX

所以,如果你想要那样,你就可以做到。如果你不想那样,那么显然你不应该这样做。

请注意,如果在命名空间中包含,则可能会在.cpp文件中定义但在XXX命名空间内没有的符号中出现链接器错误。因此,声明将在namesapce XXX::ABC中,而定义将在名称空间ABC中。因此,如果您在<iostream>命名空间中包含此符号,则会因XXX的符号而出现链接器错误。

答案 2 :(得分:1)

不,你应该在命名空间之外做#includes。否则,您将破坏您所包含的头文件中所有内容的名称。在上面发布的情况下,您将破坏标准库元素的名称;它甚至不太可能成功构建。

答案 3 :(得分:0)

Afaik ..第一个是更好的编码练习..再次那只是我..