C++ Boost';s";cstdint“;用法

C++ Boost';s";cstdint“;用法,c++,boost,wrapper,cstdint,C++,Boost,Wrapper,Cstdint,Boost的C99 stdint实现非常方便。不过有一件事让我很烦。他们将所有的typedef转储到boost命名空间中。使用此功能时,我有三个选择: 使用“使用命名空间boost” 使用“使用boost::[u]\u t” 使用boost::前缀显式引用目标类型;e、 例如,boost::uint32\u t foo=0 选择权№ 1有点违背了名称空间的观点。即使在局部范围内使用(例如,在函数内),函数参数之类的东西仍然必须像option一样加前缀№ 三, 选择权№ 2更好,但是有很多这样

Boost的C99 stdint实现非常方便。不过有一件事让我很烦。他们将所有的typedef转储到
boost命名空间中。使用此功能时,我有三个选择:

  • 使用“
    使用命名空间boost
  • 使用“
    使用boost::[u]\u t
  • 使用
    boost::
    前缀显式引用目标类型;e、 例如,
    boost::uint32\u t foo=0

    • 选择权№ 1有点违背了名称空间的观点。即使在局部范围内使用(例如,在函数内),函数参数之类的东西仍然必须像option一样加前缀№ 三,
    • 选择权№ 2更好,但是有很多这样的类型,所以它会变得很吵
    • 选择权№ 3增加了极端噪音水平;
      boost::
      前缀通常是≥ 与所讨论类型的长度相同

    我的问题是:将所有这些类型引入全局名称空间的最优雅的方式是什么?我是否应该在利用选项的
    boost/cstdint.hpp
    周围编写一个包装器№ 2.这件事怎么办


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

    名称空间Foo
    {
    #包括
    名称空间boost_alias=boost;
    }
    使用名称空间Foo::boost\u别名;
    

    编辑:我想另一个选择是使用预处理器使其在VC10上工作?以上面的片段为例:

    #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
    
    #如果包括福乌水电站#
    #定义包含的FOO_水电站
    #如果_MSC_VER>=1600/*VC++10*/|定义使用_NATIVE_STDINT_头
    #包括
    #否则
    名称空间cstdint_包装器
    {
    #包括
    名称空间boost_alias=boost;
    }
    使用名称空间cstdint_包装器::boost_别名;
    #恩迪夫
    #恩迪夫
    

    我想工作少了?

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

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


    不过,我建议的是一个小小的变体:将那些
    使用
    声明的
    放在另一个名称空间中,比如
    cstdint
    或其他什么;然后,您可以选择使用cstdint放置
    在您自己的代码中,或者明确指定特定用途的
    cstdint::

    我只使用C99的
    stdint.h
    (实际上现在是VS2010)。对于不包括它的Visual C/C++版本,我使用了一个来自MinGW的公共域版本,我修改了该版本以使用VC6(从我必须使用VC6时开始):

    在这个问题中你可能会考虑其他几个选项:

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


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

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

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

    #include <boost/cstdint.hpp>
    
    using boost::uint32_t;
    ...
    
    #包括
    使用boost::uint32_t;
    ...
    
    并将my_cstdint.hpp包含在您的应用程序中。但在我看来,在根名称空间中添加新符号是一个坏主意,因为类型可能已经由例如stdint.hc文件定义,因此可能会产生更多冲突


    即使第三个选项使用了很多字符,名称空间也是用于此目的的。boost::uint32\u t将根据您的工具集定义为正确的类型,因此只需使用它,就像使用std::uint32\u t一样。

    为什么需要所有这些类型的可能重复?我经常使用其中的一个或两个,但我想不起来曾经需要所有的。@jalf:说得好。事实上,我真的不想手动将using语句与我在代码中实际使用的类型同步。Re:cstdint.hpp与stdint.h——我认为它们唯一的区别在于,cstdint.hpp可能包括也可能不包括64位类型和相关宏,因为long-long还不是标准。除此之外,我想使用boost的版本,因为我的项目中已经有几个boost依赖项。在这种情况下,分发额外的头是没有意义的。但是您可以这样做,并将using声明添加到项目的命名空间中,而不是根。(每个人都使用特定于项目的名称空间,对吗?如果你不使用,你可能根本不在乎污染根名称空间。)
    #include <boost/cstdint.hpp>
    
    using boost::uint32_t;
    ...