Boost の C99 stdint 実装は非常に便利です。ただし、1 つ気になることがあります。それらはすべての typedef を にダンプしboost namespace
ます。この機能を使用する場合、次の 3 つの選択肢があります。
- "
using namespace boost
"を使用 - "
using boost::[u]<type><width>_t
"を使用 boost::
プレフィックスを使用してターゲット タイプを明示的に参照します。例えば、boost::uint32_t foo = 0;
- オプション № 1 の種類は、名前空間のポイントを無効にします。ローカル スコープ内 (たとえば、関数内) で使用された場合でも、関数の引数のようなものは、オプション 3 のようにプレフィックスを付ける必要があります。
- オプション 2 の方が優れていますが、これらのタイプが多数あるため、ノイズが発生する可能性があります。
- オプション 3 は極端なレベルのノイズを追加します。多くの場合、
boost::
プレフィックスは問題の型の長さ以上です。
私の質問は、これらすべての型をグローバル名前空間に持ち込む最もエレガントな方法は何でしょうか? オプション № 2 を使用するラッパーを作成して、それで終了する必要が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
仕事が減ったと思いますか?