在命名空间块中包装#include是个好主意吗?
Is it a good idea to wrap an #include in a namespace block?
我有一个C头文件,它被编写为C和c++(它只使用来自公共子集的功能,并使用extern "C"
的东西)。
问题是,头文件声明了全局命名空间中的内容。出于通常的原因,我宁愿避免那样做。我想过这样做:
namespace foo {
#include <foo.h>
}
这样做是个好主意吗?我是否有不包括编辑头文件的替代方案?
不,这是个坏主意。对于c++声明,当标识符在错误的名称空间中声明时,很可能会引入链接器错误。对于C声明,它可以工作,但它可能会隐藏全局命名空间中标识符之间的冲突(我猜您试图避免),直到链接时间;并没有真正地将标识符放在命名空间中。
一个更好的主意是把你自己的标识符放在一个命名空间中,避免在全局命名空间中定义main
以外的任何东西。
我在90年代末为<windows.h>
做了这种"放置在命名空间中"。
虽然没有完全的支持:它是基于在我需要的时候添加支持的原则。
实现这一工作的关键是检查包含了哪些C库头文件,并确保首先包含它们。它归结为4个这样的标题,IIRC。然而,微软对宏的喜爱使事情变得困难。
所以它可以在实践中为C头文件(或c++限制为类C子集)完成,但代价是为每个新版本的包装器更新包装器,这是不切实际的和/或非常昂贵的。更不用说辛苦了。
总之,不,这不是一个好主意。: -)
经验之谈
相关文章:
- 什么时候在C++中返回常量引用是个好主意
- 使用嵌套函数数组是个好主意吗?
- 将std::regex设置为静态的好主意吗
- 使用共享库进行变体处理是个好主意吗?
- 使用列表<Byte>不是好主意吗?
- 用C++编写多级内联函数是个好主意吗?
- 重载参数 C++ 是个好主意吗?
- 扩展 std::vector 是个好主意吗?
- 将 int32_t 键入为 int 是个好主意吗?
- 常量参考延长对象的寿命,然后是const_cast,这是一个好主意吗?
- 使用 QT 开发服务器应用程序是个好主意吗?(QT5)
- 用 constexpr 中的工会取代reinterpret_cast - 好主意?
- 将C 11设置功能更改为带有转发的现代模板功能是一个好主意
- 在哪里使用"std::valarray"是个好主意?
- std :: tr1 :: shared_ptr throw bad_alloc,也是一个好主意
- 在构造函数中循环C++是一个好主意吗?
- 重载指向集合的指针的开始/结束是否是个好主意
- 是一个哨兵 QWidget 一个好主意(以防止在创建和填充布局时出现内存泄漏)
- 搞砸常量是个好主意吗?
- 在命名空间块中包装#include是个好主意吗?