C/C++typedef温習

1466 ワード

typedefの役割:別名を宣言するために使用されます.
使用する場合は以下の3種類があります.
1)コンパイルプロセスの一部であり、メモリ領域が実際に割り当てられていないタイプの別名を定義します.
このような使用シーンではtypedefはdefineの役割と同じである.異なる点はdefineが宣言したタイプの別名であり、単純なマクロ置換にすぎない.
次のようになります.
char* pa, pb; 
typedef char* PCHAR;
#define PCHAR2 char*;
PCHAR s1, s2;
PCHAR2 s3, s4;
typedef int ARRAY[10];
typedef int(*PF)(void);
ARRAY m1;

定義されたpa,s 1,s 2,s 3は文字変数を指すポインタであり,pb,s 4は文字変数である.
なぜなら、defineは単純な文字列置換にすぎず、typedefはタイプに別名を付けたからです.
Arrayはint[10]の別名であるため、m 1は10個の要素を含むintタイプの配列である.一方,PFはパラメータを一切持たず,intタイプの戻り値を持つ関数ポインタを指す.
2)以前のCコードでは、structの新しいオブジェクトを宣言する際にstruct、すなわち、
struct構造名オブジェクト名;
C++では、次のように直接使用できます.
構造名オブジェクト名;
structオブジェクトを1つ少なく書くために、このような書き方があります.
typedef struct tagPoint{
  int x;
  int y;
}POINT;

POINT p1; 

3)typedefを用いてプラットフォームに関係のないタイプを定義する.
トラップの使用:
トラップ1:
覚えておいてください:typedefはタイプの別名を定義します.
次の文のコンパイルでエラーが発生します.
typedef char* PSTR;
char string[4] = "abc";
const char* p1 = string;
const PSTR p2 = string;
p1++;
p2++;

備考:p 2++エラー、typedefは単純なマクロ置換ではなく、const PSTR p 2はconst char*p 2に等しくないため
char*const p 2に等しい.すなわち、文字を指す定数ポインタが定義され、p 2は読み取り専用で変更できない.
トラップ2:
typedefは文法的にauto,extern,mutable,static,registerなどのストレージクラスのキーワードであり,実際にはオブジェクトストレージの特性に影響を与えないが,
ただし、上記のストレージクラスキーワードを変数に一緒に使用することはできません.そうでない場合、コンパイラは「1つ以上のストレージクラスが指定されています」とプロンプトします.