0

以下のデータ型を定義します。

typedef int MyInt;

次に、以下のコードのように、MyIntのサイズに基づいて新しいデータ型を定義したいと思いますが、その解決策を見つけることができません。

#if sizeof(MyInt) == 2
    typedef long MyLong;
#else
    typedef short MyLong;
#endif

誰か助けてもらえますか?

4

5 に答える 5

5

を評価するのはプリプロセッサの仕事ではなく、プロセスのsizeof後の段階であるコンパイラによって行われます。評価sizeofには、プリプロセッサにはまったくない深い C の知識が必要です。

(理論的には)プリプロセッサを別のステップと見なすことができます。これは、テキストのみの変換を行い、実際には「foo.c」を「foo-preprocessed.c」に変換します。後者のファイルには#includeor#ifが残っていません。それらはすべて評価され、プリプロセッサによって置き換えられます。実際のコンパイラはそれらを認識しません。

<stdint.h>および既知の精度の型 (uint16_tとその仲間)の使用を検討する必要があります。

于 2012-12-07T10:11:19.287 に答える
4

UINT_MAX基になる型のサイズを決定するなど、マクロの値を使用できます。

于 2012-12-07T10:09:15.417 に答える
1

使用できますUINT_MAX-整数のサイズについての手がかりを与えることができます。

#if (UINT_MAX <= 65536)
    typedef long MyLong;
#else
    typedef short MyLong;
#endif
于 2012-12-07T10:09:58.037 に答える
0

私と C プリプロセッサは敵対関係にありますが、お互いが必要な場合もあります ;)。だから私は提案します:

#if SIZEOF_MYINT == 2
#   define MYLONG_T long
#elif SIZEOF_MYINT == 4
#   define MYLONG_T short
#endif

typedef MYLONG_T MyLong;

他の場所 (グローバル構成ヘッダー ファイル内) で、アーキテクチャに依存しています。

#define SIZEOF_MYINT 2
于 2012-12-07T12:04:31.643 に答える
0

十分に新しいGCC(4.3だと思います)には、のような定義済みの識別子がありますが、他の人が提案したよう__SIZEOF_LONG__に定数を使用する方が簡単です。limits.h

于 2012-12-07T11:08:05.327 に答える