Boost的“ CSTDINT”用法
题
Boost的C99 stdint实施非常方便。不过,有一件事让我感到烦恼。他们将所有类型的FOMM倾倒到 boost namespace
. 。使用此设施时,这给我带来了三种选择:
- 采用 ”
using namespace boost
" - 采用 ”
using boost::[u]<type><width>_t
" - 明确指的是带有目标类型
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
我想更少的工作?
解决方案
我只是使用C99 stdint.h
(实际上是在VS 2010中)。对于不包含它的Visual C/C ++版本,我使用MINGW的公共域版本,该版本已修改为使用VC6(从必须在VC6中工作时):
您在这个问题中可能会考虑其他几个选择: C99 stdint.h标题和MS Visual Studio
如果您想继续使用 boost/cstdint.hpp
, ,我想说的是,实施将类型的包装标头实施到全球名称空间中的建议将是必经之路。
做 boost/cstdint.hpp
提供我应该知道的任何内容 stdint.h
?
其他提示
您编写实现选项2的包装标头的想法绝对是这三个选项中的更好。
但是,我建议的是一个轻微的变体:放 using
另一个名称空间中的声明,例如 cstdint
或者其他的东西;然后,您可以选择 using cstdint;
用您自己的代码或明确指定 cstdint::
在特定用途上。
如果您直接包含该文件,则将被迫将其与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。如果情况太长,则可以使用Typedefs减少代码量。