以下のデータ型を定義します。
typedef int MyInt;
次に、以下のコードのように、MyIntのサイズに基づいて新しいデータ型を定義したいと思いますが、その解決策を見つけることができません。
#if sizeof(MyInt) == 2
typedef long MyLong;
#else
typedef short MyLong;
#endif
誰か助けてもらえますか?
以下のデータ型を定義します。
typedef int MyInt;
次に、以下のコードのように、MyIntのサイズに基づいて新しいデータ型を定義したいと思いますが、その解決策を見つけることができません。
#if sizeof(MyInt) == 2
typedef long MyLong;
#else
typedef short MyLong;
#endif
誰か助けてもらえますか?
を評価するのはプリプロセッサの仕事ではなく、プロセスのsizeof
後の段階であるコンパイラによって行われます。評価sizeof
には、プリプロセッサにはまったくない深い C の知識が必要です。
(理論的には)プリプロセッサを別のステップと見なすことができます。これは、テキストのみの変換を行い、実際には「foo.c」を「foo-preprocessed.c」に変換します。後者のファイルには#include
or#if
が残っていません。それらはすべて評価され、プリプロセッサによって置き換えられます。実際のコンパイラはそれらを認識しません。
<stdint.h>
および既知の精度の型 (uint16_t
とその仲間)の使用を検討する必要があります。
UINT_MAX
基になる型のサイズを決定するなど、マクロの値を使用できます。
使用できますUINT_MAX
-整数のサイズについての手がかりを与えることができます。
#if (UINT_MAX <= 65536)
typedef long MyLong;
#else
typedef short MyLong;
#endif
私と 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
十分に新しいGCC(4.3だと思います)には、のような定義済みの識別子がありますが、他の人が提案したよう__SIZEOF_LONG__
に定数を使用する方が簡単です。limits.h