3

私はで利用可能な既存の情報を調べました

typedefとdefine & typedef、#defineの違い

すべての返信は本当に有益です。もう1つの例に出くわしましたが、この動作の理由を教えてください。

unsigned int変数を宣言する場合、これは機能します。

#define INTEGER int
unsigned INTEGER i = 10;

ただし、typedefの場合は機能しません。

例えば

typedef int INTEGER;
unsigned INTEGER i = 10;

エラーがスローされます: 'i'宣言されていません(この関数での最初の使用)

前もって感謝します!

4

3 に答える 3

3

プリプロセッサはコピーと貼り付けを行うだけです。あなたが書くとき:

#define INTEGER int
unsigned INTEGER i = 10;

コンパイラ自体の前に、プリプロセッサはコードを次のように変換します。

unsigned int i = 10;

ただし、typedefコンパイラによって処理されます。

C11(n1570)、§6.7.8タイプ定義

宣言は新しいタイプを導入せず、そのtypedefように指定されたタイプの同義語のみを導入します。つまり、次の宣言では次のようになります。

typedef T type_ident;
type_ident D;

type_identは(として知られている)typedefの宣言指定子によって指定されたタイプの名前として定義され、Dの識別子はタイプ''派生-宣言者-タイプ-リスト''を持ち、派生-宣言者-タイプ-リストはによって指定されますの宣言者。TTTD

つまり、<INTEGER>はの同義語です<int>。しかし<unsigned INTEGER>、存在しない単一のタイプとして扱われます。

于 2013-03-01T15:54:26.470 に答える
1

typedeftypedef宣言にある正確なタイプのタイプエイリアスを作成します。その型は、コンパイラーによってTrueTypeとして認識されます。あなたの場合、適切なタイプINTEGERがありますが、unsigned INTEGERタイプがないため、エラーになります。

マクロ(#define)は、コンパイラがそれを認識する前に、プリプロセッサによって置き換えられます。したがって、コンパイラの場合、最初のケースは単純です。

unsigned int i = 10;
于 2013-03-01T15:54:04.373 に答える
1

その理由はtypedef、1:1のリテラルテキスト置換ではないためです。基本的に、最初のケースでunsigned INTEGERは、に展開されunsigned intます。これは有効な型名です(Cでは、型名と修飾子の特定の組み合わせのみが許可されておりunsigned int、そのうちの1つです)。

ただし、2番目のケースでは、unsigned INTEGERタイプ名の有効な組み合わせではありません。

于 2013-03-01T15:54:17.553 に答える