2011-01-09 13 views
1

私は、一定サイズの符号なし型を必要とするプログラムを書いています。私はuint8、uint16、uint32、およびuint64が必要です。それらをtypes.hで定義する必要があります。つまり、プラットフォームに関係なく常に正しく定義されます。Cでのマクロの型チェックサイズ

私の質問は、どのようにプリプロセッサマクロを使って各プラットフォームのさまざまな型のサイズを調べることができるのですか?つまり、types.hヘッダーで自分のカスタム型を正しく定義できますか?

答えて

0

あなたも、これらすべてのタイプが(たとえば、でもは64ビット整数は存在しない可能性があります)お使いのプラットフォーム上で存在しますので、あなたはおそらくのプラットフォームに依存しないコードを書くことができないことを保証することはできませんコンパイル時にそれらを検出します。

+0

私は、64ビット整数が一部のプラットフォームで問題になることを認識しています。 – TachyonImpact

+0

これは64ビットだけではありません。プラットフォームに依存しないCコードを書いているならば、 'sizeof(long long int)> = sizeof(long int)> = sizeof(short int) '...しかし、実際の目的では、すべて16ビットになる可能性があります。このようなコードを書く前に、非標準的なものを想定する必要があります。 – Mehrdad

+1

No. Cは 'ULONG_MAX'が少なくとも2^32-1、' ULLONG_MAX'が少なくとも2^64-1であることを要求します。 –

4

Cは、これらの標準的なtypedefsを持っています。あなた自身を定義しないでください。彼らはintN_tuintN_tと呼ばれ、Nは8,16,32,64などです。それらを得るには<stdint.h>を含みます。

stdint.hが足りない古代コンパイラを使用している場合は、作業している壊れたプラットフォームに対して、適切なtypedefを指定するだけで済みます。私はstdint.hせずに、あなたが遭遇するあらゆる非埋め込み対象にその賭けになります。

  • CHAR_BITは8
  • sizeof(char)で1 <である - 私はこの1つ上もっと賭けたい... ;-)
  • sizeof(short) 2.
  • sizeof(int)されるタイプが存在する場合、4
  • sizeof(long long) 8.
ある

壊れたシステムの塗りつぶしとしてこれらを使用してください。

+0

'inttypes.h'もこれらの型に手を加えています。これらのヘッダーはPOSIXでは間違いありませんが、C標準にも関わらず、私は気づいていませんでした。きちんとした – ephemient

+2

古代のコンパイラは、この使用することができますMSVCであることを起こる場合:フィルインなどの標準的な整数型を使用している場合、あなたはまた、プリプロセッサを使用する必要がありますhttp://msinttypes.googlecode.com/svn/trunk/stdint.h – Martin

+2

を正しい範囲を確認する: '#if UINT_MAX!=0xFFFFFFFF␤#error" intは32ビットではない "␤#endif" – Christoph