どのヘッダファイルのブーストライブラリは、独自のプリミティブデータ型を定義しているのですか?
-
25-09-2019 - |
質問
最近、私はブーストを使用しよう::精神::気バイナリエンディアンパーサいくつかのバイナリデータを解析するためには、プラットフォームのエンディアンに依存します。簡単な例は次のように、あります:
の宣言と変数を使用します:
using boost::spirit::qi::little_word; using boost::spirit::qi::little_dword; using boost::spirit::qi::little_qword; boost::uint16_t us; boost::uint32_t ui; boost::uint64_t ul;
リトルエンディアンバイナリパーサの基本的な使用方法:
test_parser_attr("\x01\x02", little_word, us); assert(us == 0x0201);
test_parser_attr("\x01\x02\x03\x04", little_dword, ui); assert(ui == 0x04030201);
test_parser_attr("\x01\x02\x03\x04\x05\x06\x07\x08", little_qword, ul);
assert(ul == 0x0807060504030201LL);
test_parser("\x01\x02", little_word(0x0201));
test_parser("\x01\x02\x03\x04", little_dword(0x04030201));
test_parser("\x01\x02\x03\x04\x05\x06\x07\x08",
little_qword(0x0807060504030201LL));
これは非常にうまく機能します。しかし、私の質問は、なぜ我々はここboost::uint16_t
、boost::uint32_t
のようないくつかのデータ型を使用する必要がない、来ますか?私はここでunsigned long
またはunsigned int
を使用することはできますか?
私はdouble
またはfloat
データ型を解析したい場合や、どのようなブーストデータタイプIは、使用する必要がありますか?ブーストは、これらのタイプの上に定義されていると私に教えてください?
解決
uint16_tかのuint32_tが存在のようなタイプは、特定のビット幅を有するように変数を宣言することができるように。彼らは異なるアーキテクチャおよび/または実装上のサイズが異なるので、あなたは「長い間」のような通常のタイプでこれを行うことはできません。前述上述のタイプは、通常、特定のサイズを取得するために実装/建築特定のタイプに型定義をもたらすプリプロセッサ計算を通してによって導出される。
他のヒント
は、ファイル<boost/cstdint.hpp>
はboost::(u)int(8|16|32|64)_t
定義がすべて含まれています。 MSVCは<cstdint>
同梱されていませんので、これは主に提供されます。また、(gccのような)Cコンパイラ<boost/cstdint.hpp>
だけで輸入されているC ++コンパイラでは、ブースト名前空間に<cstdint>
ます。
も参照してください。 stdint.hする