提高使用率(&Q)

2022-04-18 00:00:00 wrapper c++ boost cstdint

Boost的C99 stdint实现非常方便。不过,有一件事困扰着我。它们将所有类型定义转储到boost namespace中。在使用此工具时,我有三个选择:

  1. 使用"using namespace boost"
  2. 使用"using boost::[u]<type><width>_t"
  3. 显式引用带有boost::前缀的目标类型;例如boost::uint32_t foo = 0;

  • 选项№1有点违背了名称空间的要点。即使在局部作用域中使用(例如,在函数中),像函数参数这样的东西仍然必须像选项№3一样加上前缀。
  • 选项№2较好,但此类类型较多,因此可能会产生噪音。
  • 选项№3增加了极大的噪音;boost::前缀通常与相关类型的长度相同(≥)。

我的问题是:将所有这些类型引入全局命名空间的最优雅方式是什么?我应该只在boost/cstdint.hpp周围编写一个使用选项№2的包装并完成它吗?


另外,这样包装标头在VC++10上不起作用(标准库标头有问题):

namespace Foo
{
  #include <boost/cstdint.hpp>

  namespace boost_alias = boost;
}

using namespace Foo::boost_alias;

编辑:我猜另一个选择是使用预处理器使其在VC10上工作?获取上面的代码片段:

#ifndef FOO_HPP_INCLUDED
#define FOO_HPP_INCLUDED

#if _MSC_VER >= 1600 /*VC++ 10*/ || defined USE_NATIVE_STDINT_HEADER
  #include <stdint.h>
#else
  namespace cstdint_wrapper
  {
    #include <boost/cstdint.hpp>

    namespace boost_alias = boost;
  }

  using namespace cstdint_wrapper::boost_alias;
#endif

#endif

我想是工作量减少了吧?


解决方案

我只使用C99的stdint.h(它现在实际上是在VS 2010中)。对于不包括它的Visual C/C++版本,我使用来自MinGW的公共域版本,我修改该版本以使用VC6(从我不得不在VC6中工作时起):

  • http://snipplr.com/view/18199/stdinth/

您可以在此SO问题中考虑其他几个选项:C99 stdint.h header and MS Visual Studio

如果您想继续使用boost/cstdint.hpp,我想说的是,建议实现一个将类型带入全局命名空间的包装器标头。

boost/cstdint.hpp是否提供了stdint.h中没有介绍的我应该知道的内容?

相关文章