2012-03-29 102 views
1

可能重复:
Is it a good idea to wrap an #include in a namespace block?我们应该将#include放入命名空间吗?

// 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

http://stackoverflow.com/a/2868971/76173 – thorn 2012-03-29 16:01:07

回答

6

你必须不是包括你的名字空间内的<iostream>。你会得到链接错误。

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

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

+0

它不会导致缺少定义链接器错误,但它很容易导致重复定义链接器错误,因为它并没有真正将定义放在名称空间中。 – 2012-03-29 16:42:25

2

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

如果你将它们包含在命名空间中,那么heades将在命名空间内部展开,这意味着头部中的所有名称将在命名空间中声明/定义,在你的情况下是XXX

所以,如果你想这样做,你可以做到这一点。如果你不想这样做,那显然你不应该那样做。

请注意,如果您包含在命名空间中,那么对于您在.cpp文件中定义的那些符号,在XXX名称空间内没有定义的符号,可能会出现链接器错误。所以声明将在名称空间XXX::ABC中,而定义将位于名称空间ABC中。所以由于这个原因,如果你在XXX命名空间中包括这个,你将得到来自<iostream>的符号的链接器错误。

0

据我所知..第一个是更好的编码实践..再那空间外面只有我..

+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 – tune2fs 2012-11-15 05:52:39

+0

@ tune2fs:不同意:它*是*和答案,只是不是很好备份或有用的。 – Mac 2012-11-15 05:58:29

1

不,你应该做你的#includes。否则,你会打乱你包含的头文件中的所有东西的名字。在上面发布的情况下,您将会破坏标准库元素的名称;它甚至不可能成功构建。

相关问题