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

Is it a good idea to wrap an #include in a namespace block?

本文关键字:好主意 #include 命名空间 包装      更新时间:2023-10-16

我有一个C头文件,它被编写为C和c++(它只使用来自公共子集的功能,并使用extern "C"的东西)。

问题是,头文件声明了全局命名空间中的内容。出于通常的原因,我宁愿避免那样做。我想过这样做:

namespace foo {
#include <foo.h>
}

这样做是个好主意吗?我是否有不包括编辑头文件的替代方案?

不,这是个坏主意。对于c++声明,当标识符在错误的名称空间中声明时,很可能会引入链接器错误。对于C声明,它可以工作,但它可能会隐藏全局命名空间中标识符之间的冲突(我猜您试图避免),直到链接时间;并没有真正地将标识符放在命名空间中。

一个更好的主意是把你自己的标识符放在一个命名空间中,避免在全局命名空间中定义main以外的任何东西。

我在90年代末为<windows.h>做了这种"放置在命名空间中"。

虽然没有完全的支持:它是基于在我需要的时候添加支持的原则。

实现这一工作的关键是检查包含了哪些C库头文件,并确保首先包含它们。它归结为4个这样的标题,IIRC。然而,微软对宏的喜爱使事情变得困难。

所以它可以在实践中为C头文件(或c++限制为类C子集)完成,但代价是为每个新版本的包装器更新包装器,这是不切实际的和/或非常昂贵的。更不用说辛苦了。

总之,不,这不是一个好主意。: -)

经验之谈