Boost的C99 stdint实施非常方便。不过,有一件事让我感到烦恼。他们将所有类型的FOMM倾倒到 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;

编辑:我想另一个选择是使用预处理器使其在VC 10上工作?在上面拍摄摘要:

#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中工作时):

您在这个问题中可能会考虑其他几个选择: C99 stdint.h标题和MS Visual Studio

如果您想继续使用 boost/cstdint.hpp, ,我想说的是,实施将类型的包装标头实施到全球名称空间中的建议将是必经之路。

boost/cstdint.hpp 提供我应该知道的任何内容 stdint.h?

其他提示

您编写实现选项2的包装标头的想法绝对是这三个选项中的更好。

但是,我建议的是一个轻微的变体:放 using 另一个名称空间中的声明,例如 cstdint 或者其他的东西;然后,您可以选择 using cstdint; 用您自己的代码或明确指定 cstdint:: 在特定用途上。

如果您直接包含该文件,则将被迫将其与std ::前缀。因此,问题是,在这种情况下,您会选择哪种选项。您将如何处理Boost引入的其他类型?您会以boost ::前缀吗?

拳头显然是一个不好的选择。您可以使用MY_CSTDINT.HPP文件实现选项两个

#include <boost/cstdint.hpp>

using boost::uint32_t;
...

并在您的应用程序中包含my_cstdint.hpp。但是在我看来,在根名称空间上添加新符号是一个坏主意,您可以获得更多冲突,因为类型已经可以由stdint.h c文件定义。

即使第三个选项使用很多字符,为此目的存在命名空间。 BOOST :: UINT32_T将根据您的工具集定义为正确的类型,因此只需使用std :: uint32_t即可使用它。

我个人总是使用选项3。如果情况太长,则可以使用Typedefs减少代码量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top