2010-04-25 129 views
5

Boost的C99 stdint实现非常方便。但有一件事让我感到不安。他们将所有的typedefs转储到boost namespace。使用此工具时,这给我留下了三个选项:Boost的“cstdint”用法

  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 

工作量减少了,我猜?

+0

可能的重复http://stackoverflow.com/questions/1481733/portable-c-03-exact-width-types – 2010-04-25 17:21:07

+0

@gf:漂亮的脚本,谢谢。 – patt0h 2010-04-25 17:43:59

+0

为什么你需要*所有这些类型?我经常使用其中的一个或两个,但我无法想起需要所有这些。 – jalf 2010-04-25 18:27:25

回答

5

我只是使用C99的stdint.h(它实际上现在在VS 2010中)。对于不包括它的Visual C/C++的版本,我使用MinGW的一个公共领域版本,我修改与VC6工作(从当我在VC6工作):

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

如果您想继续使用boost/cstdint.hpp,我会说,实施一个包装头,带来的类型分为的建议全球命名空间将成为未来之路。

请问boost/cstdint.hpp是否提供任何我应该知道的不在stdint.h

+0

回复:cstdint.hpp vs stdint.h - 我认为他们唯一的区别是cstdint.hpp可能包含或不包含64位类型和关联的宏,因为long long还不是标准的。除此之外,我想使用boost的版本,因为我的项目中已经有几个boost提升依赖项。在这种情况下分发额外的头文件没有意义。 – patt0h 2010-04-25 17:40:18

1

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

2

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

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

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一样。

+0

但是你可以这样做,并将使用声明添加到项目的名称空间而不是根目录。 (每个人都使用特定于项目的命名空间,对吗?如果你不这样做,那么你可能不会在意污染根命名空间。) – 2011-02-09 11:07:25