typedef&使用方法との違いを定義します

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

 

おすすめ

転載: www.cnblogs.com/zhangjixiao/p/12005725.html