Boost的C99 stdint实现非常方便。不过有件事困扰着我。他们把所有的字体都倒入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少干活吧,我猜?
发布于 2010-04-25 17:22:28
我只使用C99的stdint.h (实际上现在是VS 2010)。对于不包括Visual /C++版本的Visual/C++,我使用来自MinGW的公共域版本,该版本是我修改后用于使用VC6的(从必须在VC6中工作时起):
在这个问题中,您可能会考虑其他几个选项:C99 stdint.h header and MS Visual Studio
如果您想继续使用boost/cstdint.hpp,我想说的是,实现将类型引入全局命名空间的包装头的建议是可行的。
boost/cstdint.hpp提供了什么我应该知道的东西没有在stdint.h中
发布于 2010-04-25 17:16:25
您编写实现选项2的包装头的想法肯定是这三个选项中最好的一个。
不过,我建议的是一个细微的变化:将这些using声明放在另一个名称空间中,比如cstdint或其他什么;然后,您可以选择在自己的代码中放置using cstdint;,或者在特定用途上显式指定cstdint::。
发布于 2010-04-25 17:37:53
如果直接包含该文件,您将被迫在文件的前缀加上std::。所以问题是,在这种情况下你会选择哪种选择。你会对Boost引入的其他类型做些什么?你会在它们前面加上助推词::还是不加?
第一个显然是个糟糕的选择。您可以使用my_cstdint.hpp文件实现选项二。
#include <boost/cstdint.hpp>
using boost::uint32_t;
...并在应用程序中包括my_cstdint.hpp。但是在我看来,在根命名空间中添加新的符号是个坏主意,您可以得到更多的冲突,因为类型可以已经由stdint.hC文件定义了。
即使第三个选项使用了大量字符,名称空间也有此用途。boost::uint32_t将根据您的工具集被定义为正确的类型,所以只需使用它,就像使用std::uint32_t一样。
https://stackoverflow.com/questions/2709083
复制相似问题