7

最近typedef、自分のコードが提案したものとは大きく異なることがわかりました。このような例:

typedef int *ptype;
ptype v1 = 0, v2 = 0;

結果: v1 と v2 の両方が型へのポインターとして定義されましたint。しかし、単純に2 番目の文をptypeorに置き換えると、v1 だけがポインターになり、v2 が通常になります。単純な交換はしていないようです。さらに、次のような複雑な修飾子になると:int *int *v1 = 0, v2 = 0;int* v1 = 0, v2 =0;inttypedef

typedef int *ptype;
const ptype v3 = 0;

結果は次のようになります: v3 はポインタであり、と書くと intconstへのポインタではありません。上記のコードでは、内部ではなく、全体に対する修飾子として立っています。したがって、複合タイプを結合して新しいタイプを作成するように見えます。constconst int *v3 = 0;constptypeintptypetypedefint*

ただし、信頼できる C/C++ リファレンス Web サイトcplusplusは、「typedef は異なる型を作成しません。既存の型のシノニムを作成するだけです」と述べています。だから私は本当に混乱していて、誰かが の動作を説明するのを手伝ってくれることを願っていますtypedef. ありがとう!

4

3 に答える 3

18

「同義語」は「テキストの置換」を意味するものではありません。プリプロセッサなどによってptype文字通り展開されることはありません。int *

つまり、次のようなことができるということです。

typedef int *ptype;
ptype a;
int *b;

a = b;   // OK

ptypeint *が同じ型であるため、代入は有効です。型変換やキャストは必要ありません。

typedef既存の型に新しい名前を付けるだけです。しかし、その名前は、既存の型のすべての側面を分割できないエンティティに結合します。たとえば、( 「int へのポインター」を意味するため、「const ポインターから int」を意味します) とptype a, b;同等です。ptype a; ptype b;const ptypeptype

つまり、によって作成された新しい名前typedefは、宣言に関する限り組み込みキーワードのように動作しますが、これらの名前によって表される実際の型は同じです。

于 2013-01-15T09:19:50.937 に答える
2

cplusplus.com がtypedef新しい型を作成しないと言うとき、彼らが意味することは、値の値を使用できる場所ならどこでも、ptype型の値とその逆を使用できるということですint*。そのため、パラメーターを受け取る関数を定義すると、変換を行わずにptype渡すことができます。int*

typedefこれは、 a が aのように純粋にテキスト置換として実装されるという意味ではありません#define

于 2013-01-15T09:18:53.470 に答える
2

C89 のセクション 3.5 を参照すると、ptype v1 = 0, v2 = 0;が と同等でない理由は次のとおりint *v1 = 0, v2 = 0;です。C および C++ の新しいバージョンは C89 によって通知され、この点では本質的に同じです。

ではptype v1 = 0, v2 = 0;ptypeは「宣言指定子」、v1 = 0, v2 = 0は「初期宣言子リスト」です。具体的にptypeは「型指定子」であり、さらに具体的には「型定義名」です。v1そのため、2 つの変数 (と)を宣言していますが、どちらも の別の名前であるv2type を持っています。ptypeint*

ではint* v1 = 0, v2 = 0、 「宣言指定子」でint*はありません。これは、一連の「型指定子」、「記憶域クラス指定子」、および「型修飾子」で構成されているためです。それぞれを順番に調べることができますが、すべてまとめると、staticorのようなキーワードconst、組み込み型名、typedef および enum 名、構造体/共用体指定子の完全なリストになります。複合型の構文の一部である は含まれません。*したがって、この場合intは「宣言指定子」で*v1 = 0, v2 = 0あり、「初期宣言子リスト」です。「初期宣言子リスト」の文法を分解すると、*は にのみ適用されv1、 には適用されませんv2int*int

同様に、 oneと oneptype *v1 = 0, v2 = 0;を定義する と書くことができます。つまり、1と 1です。pytpe*ptypeint**int*

const int *vsの文法const ptypeも同様の結果になります。前者ではconst「型修飾子」は に適用されますintが、後者では に適用されptypeます。

于 2013-01-15T10:39:55.857 に答える