Boostの「CSTDINT」使用法
質問
BoostのC99 STDINT実装は非常に便利です。しかし、一つのことが私を悩ませます。彼らはすべてのtypedefをに捨てます boost namespace
. 。これにより、この施設を使用すると、3つの選択肢が残ります。
- 使用する "
using namespace boost
" - 使用する "
using boost::[u]<type><width>_t
" - でターゲットタイプを明示的に参照してください
boost::
プレフィックス;例えば、boost::uint32_t foo = 0;
- オプション№1の名前の敗北の名前空間のポイント。ローカルスコープ内で(たとえば、関数内)に使用されていても、関数の引数のようなものは、オプション3のようにプレフィックスする必要があります。
- オプション№2の方が優れていますが、これらのタイプの束があるため、騒々しくなる可能性があります。
- オプション3は、極端なレベルのノイズを追加します。
boost::
接頭辞は、多くの場合、問題のタイプの長さまで≥です。
私の質問は、これらすべてのタイプをグローバルネームスペースに導入する最もエレガントな方法は何ですか?ラッパーを書くだけです boost/cstdint.hpp
それはオプションを利用し、それで完了しますか?
また、ヘッダーのようにラッピングして、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
(実際には2010年のVSにあります)。それを含めないVisual C/C ++のバージョンには、VC6で作業するように変更したMingWのパブリックドメインバージョンを使用します(VC6で作業しなければならなかったときから):
あなたがこのことで考慮するかもしれない他のいくつかのオプションがあるので、質問は次のとおりです。 C99 STDINT.HヘッダーとMS Visual Studio
使い続けたい場合 boost/cstdint.hpp
, 、私は、グローバルネームスペースにタイプをもたらすラッパーヘッダーを実装するという提案が行く方法だと思います。
します boost/cstdint.hpp
私が知っておくべきことは何でも提供しないでください stdint.h
?
他のヒント
オプション2を実装するラッパーヘッダーを書くというあなたのアイデアは、これらの3つのオプションの中で間違いなく優れています。
私が提案するのは、しかし、わずかなバリアントです:それらを置く using
などの別の名前空間内の宣言 cstdint
か何か;次に、配置する場合はオプションがあります using cstdint;
独自のコードまたは明示的に指定します cstdint::
特定の用途について。
ファイルを直接含めた場合、STD ::でプレフィックスを強制されます。質問は、この場合にどのオプションを取るかということです。 Boostによって導入された他のタイプをどうしますか? Boost ::かどうかを付けてプレフィックスしますか?
拳のものは明らかに悪い選択肢です。 my_cstdint.hppファイルを使用してオプション2を実装できます
#include <boost/cstdint.hpp>
using boost::uint32_t;
...
アプリケーションにmy_cstdint.hppを含めます。しかし、私の意見では、ルートネームスペースに新しいシンボルを追加することは悪い考えです。たとえば、stdint.h cファイルなど、タイプは既に定義できるため、より多くの競合を得ることができます。
3番目のオプションが多くの文字を使用していても、この目的のために名前空間があります。 boost :: uint32_tは、ツールセットに応じて正しいタイプに定義されるため、std :: uint32_tを使用するように使用してください。
私は個人的に常にオプション3を使用します。物事が長すぎる場合は、Typedefsを使用してコードの量を減らすことができます。