可能重复:
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
?
谢谢
答案 0 :(得分:6)
您必须不在您的命名空间中包含<iostream>
。您将收到链接器错误。
我不建议在命名空间中包含任何标头。
唯一的例外是你有一个只定义extern "C"
函数的头文件(没有C ++函数或类),你通常可以在命名空间中包含它而不会导致链接器问题。但它仍然可能不是一个好主意。
答案 1 :(得分:2)
这取决于你想要什么,因为两者都不相同。他们每个人都有不同的意思。
如果将它们包含在命名空间内,则heades将在命名空间内扩展,这意味着标题中的所有名称都将在命名空间内声明/定义,在您的情况下为XXX
。
所以,如果你想要那样,你就可以做到。如果你不想那样,那么显然你不应该这样做。
请注意,如果在命名空间中包含,则可能会在.cpp
文件中定义但在XXX
命名空间内没有的符号中出现链接器错误。因此,声明将在namesapce XXX::ABC
中,而定义将在名称空间ABC
中。因此,如果您在<iostream>
命名空间中包含此符号,则会因XXX
的符号而出现链接器错误。
答案 2 :(得分:1)
不,你应该在命名空间之外做#includes。否则,您将破坏您所包含的头文件中所有内容的名称。在上面发布的情况下,您将破坏标准库元素的名称;它甚至不太可能成功构建。
答案 3 :(得分:0)
Afaik ..第一个是更好的编码练习..再次那只是我..