为啥 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() 的标头?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 一个线程读数据,一个线程写数据,要加锁

带有模板类的 SWIG SHARED_PTR 宏

boost::shared_ptr - 两个类之间的组合关系

smart_ptr之shared_ptr

返回 boost::shared_ptr 和从返回的原始指针构造 boost::shared_ptr 有啥区别?

boost库之内存管理shared_ptr