5

Boost の C99 stdint 実装は非常に便利です。ただし、1 つ気になることがあります。それらはすべての typedef を にダンプしboost namespaceます。この機能を使用する場合、次の 3 つの選択肢があります。

  1. " using namespace boost"を使用
  2. " using boost::[u]<type><width>_t"を使用
  3. 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

仕事が減ったと思いますか?

4

4 に答える 4

5

私はC99を使用していますstdint.h(実際にはVS 2010にあります)。それを含まないバージョンのVisualC/ C ++については、VC6で動作するように変更したMinGWのパブリックドメインバージョンを使用します(VC6で動作する必要があったときから)。

このSOの質問で検討する可能性のある他のオプションがいくつかあります。C99stdint.hヘッダーとMSVisualStudio

を使い続けたい場合boost/cstdint.hppは、型をグローバル名前空間に取り込むラッパーヘッダーを実装することをお勧めします。

boost/cstdint.hppにないことについて私が知っておくべきことを提供しstdint.hますか?

于 2010-04-25T17:22:28.117 に答える
2

ファイルを直接インクルードした場合は、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 を使用する場合と同じように使用してください。

于 2010-04-25T17:37:53.623 に答える
2

オプション 2 を実装するラッパー ヘッダーを作成するというあなたの考えは、これら 3 つのオプションの中で間違いなく優れています。

ただし、私が提案したいのは、わずかな変形です。これらの宣言を、または何かusingなどの別の名前空間内に配置します。cstdint次に、独自のコードを挿入するか、特定の用途をusing cstdint;明示的に指定するかを選択できます。cstdint::

于 2010-04-25T17:16:25.057 に答える
1

個人的には常にオプション 3 を使用します。長すぎる場合は、typedef を使用してコードの量を減らすことができます。

于 2010-04-25T17:10:40.163 に答える