为啥 boost shared_ptr 包含带有 close() 的标头?
Posted
技术标签:
【中文标题】为啥 boost shared_ptr 包含带有 close() 的标头?【英文标题】:Why does boost shared_ptr include header with close()?为什么 boost shared_ptr 包含带有 close() 的标头? 【发布时间】:2013-12-09 21:57:31 【问题描述】:我正在使用 boost 1.49.0 并且想知道为什么 boost::shared_ptr 在全局命名空间中声明 close() ,即这个程序:
#include <boost/shared_ptr.hpp>
int main()
int h = 3;
close(h);
return 0;
编译并运行。我不希望 close() 成为 shared_ptr 接口的一部分。对我来说,意想不到的后果是在我的程序中发现了一个错误,该错误使用了一个带有基于句柄的接口的 C 库。而不是调用具有独特名称的库的句柄关闭函数,例如 H5Dclose (我正在使用 hdf5 库,C 接口,而不是 C++ 接口,事后看来,我不必担心这种问题C ++接口),我错误地调用了close而不是H5Dclose,这最终编译(并调用了unix,文件句柄关闭函数)。如果遇到编译器错误就好了。
【问题讨论】:
【参考方案1】:It doesn't。该标头中没有符号close
。
我猜 Boost 使用的一些标准头文件利用了标准的宽松性,使 C 库函数在全局命名空间中可用。
如果遇到编译器错误,那就太好了。
在我看来,为H5Dclose
输入close
远远超出预期的编译器错误。无论如何,您的单元测试都会发现它,对吧?
【讨论】:
可能与BOOST_NO_iosTREAM
未定义有关。该路径似乎引入了一些 IO 标头。
我不认为 OP 声称 close
在该标题中声明(具体阅读问题标题)
对,我猜这是包含其他一些标头的副作用。我认为如果 boost::shared_ptr 没有将 close() 带入全局命名空间会更整洁,但这可能会导致其他问题。此时,执行文件 I/O 的人可能会通过此标头获取 close() 的声明。
@user2280020: boost::shared_ptr
概不负责。 close
是一个 POSIX 函数,因此无论如何都不会在命名空间 std
中找到。
我包含的示例代码是否表明 boost::shared_ptr 负责在“全局”命名空间中声明关闭(而不是在命名空间 std 中,那么我将不得不添加一个 using 语句访问它)。以上是关于为啥 boost shared_ptr 包含带有 close() 的标头?的主要内容,如果未能解决你的问题,请参考以下文章
boost::shared_ptr - 两个类之间的组合关系