首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost的"cstdint“用法

Boost的"cstdint“用法
EN

Stack Overflow用户
提问于 2010-04-25 17:08:49
回答 4查看 8.2K关注 0票数 5

Boost的C99 stdint实现非常方便。不过有件事困扰着我。他们把所有的字体都倒入boost namespace中。这使我在使用该设施时有三种选择:

"using namespace boost"

  • Use "using boost::[u]<type><width>_t"

  • Explicitly使用
  1. 指具有boost::前缀的目标类型;例如,boost::uint32_t foo = 0;

  • 选项№1在某种程度上克服了名称空间的问题。即使在局部范围内使用(例如,在函数中),像函数参数之类的东西仍然必须像选项№3那样前缀。
  • 选项№2更好,但是有很多这样的类型,因此它可以使
  • №3增加极大的噪声;boost::前缀通常是在所述类型的长度中的≥。

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

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

代码语言:javascript
复制
namespace Foo
{
  #include <boost/cstdint.hpp>

  namespace boost_alias = boost;
}

using namespace Foo::boost_alias;

编辑:我想另一种选择是使用预处理器让它在VC 10上工作?取上面的片段:

代码语言:javascript
复制
#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

少干活吧,我猜?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-25 17:22:28

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

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

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

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

boost/cstdint.hpp提供了什么我应该知道的东西没有在stdint.h

票数 5
EN

Stack Overflow用户

发布于 2010-04-25 17:16:25

您编写实现选项2的包装头的想法肯定是这三个选项中最好的一个。

不过,我建议的是一个细微的变化:将这些using声明放在另一个名称空间中,比如cstdint或其他什么;然后,您可以选择在自己的代码中放置using cstdint;,或者在特定用途上显式指定cstdint::

票数 2
EN

Stack Overflow用户

发布于 2010-04-25 17:37:53

如果直接包含该文件,您将被迫在文件的前缀加上std::。所以问题是,在这种情况下你会选择哪种选择。你会对Boost引入的其他类型做些什么?你会在它们前面加上助推词::还是不加?

第一个显然是个糟糕的选择。您可以使用my_cstdint.hpp文件实现选项二。

代码语言:javascript
复制
#include <boost/cstdint.hpp>

using boost::uint32_t;
...

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

即使第三个选项使用了大量字符,名称空间也有此用途。boost::uint32_t将根据您的工具集被定义为正确的类型,所以只需使用它,就像使用std::uint32_t一样。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2709083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档