2009-09-11 10 views

答えて

21

C99以降を使用している場合は、stdint.hを使用してください。 uint8_t(この場合は)。

C++ 11までは、このヘッダは取得されませんでした。このヘッダは、cstdintと呼ばれていました。古いバージョンのVisual C++では、C99のstdint.hをC++コードで使用することはできませんでしたが、その他のC++ 98コンパイラはほとんどすべてのコンパイラが使用していました。非常に多くの他のものと同じように

boost/integer.hppの違いを超えるBoost論文、コンパイラの標準C++ライブラリがない場合uint8_tのようなものを提供します。

2

個人的には、私は​​とboost::uint8_tが好きです。

ブーストを使用したくない場合は、boost\cstdint.hppを借りることができます。

もう1つの選択肢は、portable version of stdint.hthis回答からのリンク)です。

+9

私はtypedefsのためだけにboostヘッダーを必要としています。 –

+0

stdint.hはC99で定義されていますが、現行のISO C++標準では(現在のISO C++標準では)が必要でないため、一部のコンパイラではヘッダ名にC規約を使用する必要がありますそれは最も移植性の高いフォームになります。 – Clifford

1

あなたの厄介な命名規則に加えて、私は大丈夫かもしれないと思います。クロスプラットフォームの能力を支援するために、あなたのためにこれを行い、心ブーストしてください:通常タイプのがbyte_tのように、_t接尾辞いる

#include <boost/integer.hpp> 

typedef boost::uint8_t byte_t; 

注意。

+0

uint8_tを追加することで既存のコードが壊れないように、言語や標準ライブラリの拡張用に予約されているため、定義する型に "_t"を付けることは避けてください。 – Dipstick

+0

@chrisharrisこの情報はどこにありますか?私はISO C++ Standardsのドラフトを見ていますが、そのセクションを見つけることはできませんが、彼のクラス/ファンクションのテンプレートに接尾辞を付けて、彼に指摘したいと思っている同僚がいます。 – stinky472

+0

@ stinky472:ISO C規格がこれについて何を言っているのか分かりませんが、常識的にはカスタム名は標準のものと衝突しないようにするので、問題を避けるためには 'byte'を使う方が良いです。あるいは、あなたの同僚が好むなら、接尾辞の代わりに*プレフィックス*を使用してください: 't_byte'。 – MestreLion

7

は、私はあなたのコンパイラがサポートしている場合、それは、このようなuint8_tint8_tとしてC99<stdint.h>ヘッダタイプを使用することを示唆しています。

コンパイラでサポートされていない場合は、作成してください。 Here'sの例VC++、それ以前のバージョンにはstdint.hがありません。 GCCstdint.hをサポートし、あなたがタイプのエイリアスを作成しませんので、もしcharの符号は、実装定義されていることであるあなたの提案とC99

一つの問題の実際に最もありません。あなたは少なくともサインについて明白でなければなりません。 のC#には、たとえばcharが16ビットなので、アイデアにはいくつかメリットがあります。しかし、それはバイトタイプも持っています。あなたの提案には問題はありませんでした


追加のノート...

、あなたは実際には符号なしの指定でした。

データが実際に文字データである場合、つまりコンソールに表示されるようなプレーンテキストの表現である場合は、プレーンcharが使用されることをお勧めします。これにより、標準ライブラリとサードパーティのライブラリを使用する際の型式合意の問題が少なくなります。一方、データがビットマップなどの文字以外のエンティティを表す場合、または算術演算を実行する数値「小整数」データまたは論理演算を実行するデータである場合は、 stdint.hタイプ(またはそれらのうちの1つから定義されたタイプ)を使用する必要があります。

あなたがbyteタイプを定義するためにそれを使用している場合でも、stdint.h可能性を使用することがより望ましい理由があるので、私は最近、charは、実際の16ビットであるTI C54xxコンパイラに出巻き込まれましたunsigned charが適切なエイリアスであると仮定します。

+0

私の例については、ウォーレンの答えが正しいとマークしました。彼は最初であり、彼の投稿は簡潔でした。あなたを少なくともアップアップしました... –

0

私は、標準の型unsigned char、uint8_tなどを使用することをお勧めします。ソースを見ているプログラマは、コードを書くためにヘッダを参照する必要はありません。より多くのtypedefを使用するほど、他の人があなたの入力規則を知るのにかかる時間が長くなります。構造体では、絶対にtypedefを使用しますが、プリミティブではそれを控えめに使用します。

4

私は、型がその中に格納されている値の意味を伝えることを好みます。私のマシン上にバイトを記述するタイプが必要な場合は、unsigned charよりもbyte_tが好きです。 (私はsigned charまたはunsigned charのいずれかを使用してUTF-8文字列を格納するコードベースで作業しています)。同じことがuint8_tになります。それはちょうどそのように使うことができます:8ビットの符号なし整数。

byte_t(他の適切な名前のタイプと同様)で定義されているものを参照する必要はほとんどありません(もしそうなら、良いエディタが3秒かかるでしょう;たぶん10秒、コードベースが巨大な場合)、それを見るだけで、そのタイプのオブジェクトに何が格納されているかがわかります。

関連する問題