将#include包装在名称空间块中是一个好主意吗?

我有一个C头被编写为C和C ++(它只使用公共子集的function,并使用extern "C"东西)。

问题是,这个头文件在全局命名空间中声明了一些东西。 我宁愿避免通常的原因。 我想过这样做:

 namespace foo { #include <foo.h> } 

这是一个好主意吗? 我有替代品,不包括编辑头文件吗?

不,这是一个坏主意。 使用C ++声明,可能会引入链接器错误,因为标识符是在错误的名称空间中声明的。 使用C声明,它可以工作,但它可能会隐藏全局命名空间中的标识符之间的冲突(我试图避免),直到链接时间; 它并不是真的把标识符放在一个名字空间中。

更好的办法是将自己的标识符放在名称空间中,并避免在全局中定义除main任何东西。

我在20世纪90年代后期为<windows.h> ”做了这样的“放置在命名空间中”。

虽然没有得到完全的支持,但是在我需要的时候,根据需要随时增加支持的原则。

做这个工作的关键是检查包含哪些C库标题,并确保首先包含它们。 它归结为4个这样的标题,IIRC。 但是,微软对macros的喜爱让事情变得困难。

所以在C头文件(或C ++限于类C子集)中可以做到这一点,但是要花费更新包装的每一个新版本,这是不切实际和/或非常昂贵的。 更不用说辛苦了。

总之,不,这不是一个好主意。 🙂

从经验谈起。