Boost的C99 stdint实现非常方便。但有一件事让我感到困惑。他们将所有的typedef转储到boost namespace
。这使我在使用这个设施时有三个选择:
using namespace boost
”using boost::[u]<type><width>_t
”boost::
前缀显式引用目标类型;例如,boost::uint32_t foo = 0;
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 :(得分: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来减少代码量。