1.のtypedef
typedefの名前は、タイプ定義が意味することを意図している示唆しているが、それは新しい型を定義するのではなく、この時点で、既存の型の別名に、同様の意味を引用し、参照は、変数やオブジェクトの別名で、 typedefは、エイリアスの種類によって定義されます。二つの主要なアクションのtypedefがあります。
1.1簡素化複合型宣言
一種から明確な既存のエイリアスに複合型宣言を簡素化する、または;など。
typedef BOOL(* FuncPointer)(int型、ダブル); //型を宣言し、2つのリターンブール値(int型とdouble)との関数ポインタ型のFuncPointerのパラメータ
FuncPointer PFUNC; //は、関数ポインタ型のFuncPointerがPFUNCオブジェクト宣言します
1.2定義、プラットフォームに依存しないタイプ
プラットフォームに依存し、異なるプラットフォームの種類の定義の違いの種類をシールド;など:
タイプおよびプラットフォームに依存しないを定義するためのtypedefを使用してください。
たとえば、REALと呼ばれる浮動小数点型の定義は、ターゲットプラットフォーム上で、それが最も正確なタイプを表しています。
長い二REALのtypedef。
プラットフォームでは、長いダブル2、読まをサポートしていません。
ダブルREALのtypedef。
プラットフォームで読み取るために、トリプルダブルをサポートしていません。
フロートREALのtypedef。
すなわち、場合などのライン上のクロスプラットフォーム、長変化などの他のソースを変更することなく、自身のtypedef次。
このようsize_tのようこの技術の広範な使用、標準ライブラリ。また、typedefのは、それはマクロよりも安定しているので、単純な文字列を置換し、エイリアスの新しいタイプを定義することではないですので。
構造体と組み合わせて使用1.3
C ++、同じ効果構造体とクラスでは、民間へのデフォルトのアクセス、公共の構造体のデフォルト値、およびクラスのデフォルト値は異なります。
【例1.3.1】:
構造体の人
{
文字列名。
int型の年齢;
フロートの高さ。
}。
一人の人; </ span>の
タイプ人、人の対象者の定義の構造体定義。
若しくは
構造体の人
{
文字列名。
int型の年齢;
フロートの高さ。
}人;
同時に定義されている人のタイプの構造体の定義は、また、対象者の人を宣言しました。
C言語、定義と宣言構造体のtypedefを使用します。
【例1.3.2】:
typedefは構造体__Person
{
文字列名。
int型の年齢;
フロートの高さ。
}人; //これは別名人構造であります
人の人物。
:宣言するには、など、あなたがtypedefは構造体のPerson者を使用する必要がない場合
【例1.3.3】
[CPP]ビュー無地コピー
構造体の人
{
文字列名。
int型の年齢;
フロートの高さ。
}。
人の人物をストラクト。
若しくは
構造体の人
{
文字列名。
int型の年齢;
フロートの高さ。
}人; //人Personオブジェクトがあります
2.のtypedefとの#define違い
2.1。異なる実行時間
キーワードtypedefの効果的なコンパイル時に、それはコンパイル時にあるので、そのtypedefで機能的な型チェック。
#defineマクロが定義され、それは任意の検査なしで、すなわちコンパイルする前に、前処理の段階で発生し、そして実行単純な文字列置換機。
[例2.1.1]のtypedefは、適切な型チェックを行います。
typedef unsigned int型UINT。
空FUNC()
{
UINT値= "ABC"; //エラーC2440: '初期化':から変換できません 'のconst char型[4]' と 'UINT'
coutの<<値<<てendl;
}
[例2.1.2]の#defineは、型チェックを実行します。
//#使用例を定義します。
#define F(x)は、x * X
メインint型()
{
INT A = 6、B = 2、C。
C = F()/ F(B)。
printf( "%dの\ n" は、C)。
0を返します。
}
プログラムの出力は次のとおりです:36には、根本的な理由は、単純に#define文字列の置換です。
2.2。機能的な違いがあります。
typedefのデータ型のエイリアス、プラットフォームに依存しない定義の型を定義するために使用され、構造体と組み合わせて使用が挙げられます。
#defineはまた、定数、変数、コンパイラスイッチを定義することができるだけでなく、別名の種類を取ることができます。
2.3。異なるスコープ
限り、事前に定義されたマクロは、その後の手続において使用することができます前に、それが持っていたとして、制限範囲を#defineしていません。
typedefが独自のスコープを持っています。
[例2.3.1]制限なしの範囲は、限り、あなたは前にあまりにも事前に定義することができますよう
空関数func1()
{
#define HW "HelloWorldの";
}
空関数func2()
{
文字列str = HW;
coutの<< STR <<てendl;
}
[実施例2.3.2]とのtypedefは、独自のスコープを有します
空関数func1()
{
typedef unsigned int型UINT。
}
空関数func2()
{
UINT uValue = 5; //エラーC2065: 'UINT':宣言されていない識別子
}
【例2.3.3】
クラスA
{
typedef unsigned int型UINT。
UINT valueA;
A():valueA(0){}
}。
クラスB
{
UINT VALUEB;
//エラーC2146:構文エラー:見つかりません ';' 識別子の前に「VALUEB」
//エラーC4430:型指定が欠落 - int型を想定。注:C ++は、デフォルト-int型をサポートしていません。
}。
上記の例の使用UINTエラーがクラスAの唯一UINTスコープので、クラスBで発生します また、typedefの別名を持つクラスタイプも、[2.3.4]例を適切なアクセス権を有します。
クラスA
{
typedef unsigned int型UINT。
UINT valueA;
A():valueA(0){}
}。
空FUNC3()
{
私は1 = :: UINT。
//エラーC2248は: 'A :: UINTは':アクセスプライベートのtypedefは、クラス 'A' の中で宣言することはできません
}
そして、UINTは、パブリックアクセスを追加した後、あなたはコンパイルすることができます。
【例2.3.5】:
クラスA
{
パブリック:
typedef unsigned int型UINT。
UINT valueA;
A():valueA(0){}
}。
空FUNC3()
{
私は1 = :: UINT。
coutの<< I <<てendl;
}
2.4。ポインタの操作
ときに変更ポインタタイプ、異なる役割の両方。
typedef int型 * パイント。 #define PINTはint * INT I1 = 1、I2 = 2 。 CONST PINT&P1 = I1; // pは、コンテンツは、点pを変更することができる、変更することができないのp CONST *同等INT; constの PINT&P2 = I2; // pを変更することができる、のconst intに対応し、P点の内容を変更することはできません* P;またはCONST * P INT; PINT S1、S2; // S1およびS2がint型のポインタである PINT S3、S4; // 等価INT * S3、S4、唯一のポインタ。 空TestPointer() { 裁判所未満 << " P1:" << P1 << " * P1:" << * P1 << てendl; // P1 =&I2; // エラーC3892: 'P1':あなたはconstのある変数に代入することはできません * P1 = 5 ; 裁判所未満 << " P1:" << P1 << " * P1:" << * P1 << てendl; 裁判所未満 << " P2:" << P2 << " * P2:" << * P2 << てendl; // * P2 = 10; // エラーC3892: 'P2':あなたはconstのある変数に代入することはできません P2 =&I1; 裁判所未満 << " P2:" << P2 << " * P2:" << * P2 << てendl; } 結果: P1:00EFD094 * P1:1 P1:00EFD094 * P1:5 P2:00EFD098 * P2:2 P2:00EFD094 * P2:5