5

ISO標準Cで固定8、16、32、および64ビット長の整数型のtypedefを宣言する信頼できる方法はありますか?

私がISO標準Cと言うとき、私は厳密にそれを意味します:

  • ISO C89 / C90、C99ではありません。
  • ISO規格で定義されていないヘッダーはありません。
  • ISO規格で定義されていないプリプロセッサシンボルはありません。
  • ISO規格で指定されていないタイプサイズの仮定はありません。
  • 独自のベンダーシンボルはありません。

StackOverflowでこれに似た他の質問が表示されますが、上記の制約の1つに違反しない回答はまだありません。プラットフォームシンボルに頼らなければそれが可能かどうかはわかりません。

4

5 に答える 5

8

はい、できます。

ヘッダー ファイルlimits.hは C90 の一部である必要があります。SHRT_MAX次に、INT_MAX、 、LONG_MAX、およびtypedefのプリプロセッサ ディレクティブの値をテストし、LLONG_MAXそれに応じて typedef を設定します。

例:

#include <limits.h>

#if SHRT_MAX == 2147483647
typedef unsigned short int uint32_t;
#elif INT_MAX == 2147483647
typedef unsigned int uint32_t;
#elif LONG_MAX == 2147483647
typedef unsigned long uint32_t ;
#elif LLONG_MAX == 2147483647
typedef unsigned long long uint32_t;
#else
#error "Cannot find 32bit integer."
#endif
于 2009-10-09T23:39:46.783 に答える
7

厳密に言えば、ISO 9899:1999 は ISO 9899:1990 に取って代わり、現在の唯一の ISO 標準 C 言語仕様です。

整数型の正確な幅の typedef 名は、1999 年版の標準にのみ導入されたため、1990 年版の標準だけを使用して目的を達成することはできません。

于 2009-10-09T23:34:20.163 に答える
3

なにもない。ただし、いくつかの制限を受け入れる意思がある場合は、サイズが 32 ビットまでの個々の整数変数を宣言する信頼できる方法があります。ビットフィールドを使用するだけlongです (後者は少なくとも 32 ビット幅であることが保証されており、ビットフィールド宣言子が省略された場合に変数に収まる最大数のビットをビットフィールドで使用できます)。そう:

struct {
   unsigned long foo : 32; 
} bar;

明らかに、そのような変数へのポインターを持つことができないなど、それに伴うすべての制限があります。これが実際に購入する唯一のことは、オーバーフロー/アンダーフローの指定された境界でのラップアラウンドが保証されていることです。

それを除けば、純粋な C90 でこれを行う移植可能な方法はありません。とりわけ、準拠した C90 実装は、たとえば 8 ビット整数を持つ必要さえありません。プラットフォームを使用することは完全に合法ですsizeof(char) == sizeof(short) == sizeof(int) == 1(CHAR_BIT == 16つまり、16 ビットの機械語を持ち、個々のバイトをアドレス指定することはできません)。 . そのようなプラットフォームは、実際にいくつかの DSP の形で実際に存在すると聞いています。

于 2009-10-09T23:36:00.900 に答える
0

いいえ、できません。

ここで、Gnu のような多段階の構成プロセスをソリューションとしてカウントしたい場合はconfigure、C89 に固執してそれを行うことができます。確かに、C89 には使用できるさまざまな型があり、現在のほぼすべての実装で DTRT が行われるため、必要なサイズを取得して、純粋に準拠した C89 に固執します。ただし、ビット幅は、必要な場合でも、一般に標準では指定されません。

于 2009-10-09T23:36:10.097 に答える