5

Boost 的 C99 stdint 实现非常方便。不过,有一件事困扰着我。他们将所有的 typedef 转储到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

工作量少,我猜?

4

4 回答 4

5

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

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

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

是否boost/cstdint.hpp提供了我应该知道的不属于的内容stdint.h

于 2010-04-25T17:22:28.117 回答
2

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

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

于 2010-04-25T17:16:25.057 回答
2

如果您直接包含该文件,您将被迫使用 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 一样。

于 2010-04-25T17:37:53.623 回答
1

我个人总是使用选项 3。如果事情太长,那么您可以使用 typedefs 来减少代码量。

于 2010-04-25T17:10:40.163 回答