提升的“cstdint”用法

时间:2010-04-25 17:08:49

标签: c++ boost wrapper cstdint

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 个答案:

答案 0 :(得分:5)

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

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

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

boost/cstdint.hpp是否提供了我应该知道的不在stdint.h中的任何内容?

答案 1 :(得分:2)

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

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

答案 2 :(得分: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一样。

答案 3 :(得分:1)

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