typeof typeofとdefineの違いを詳しく解く
3037 ワード
C言語では、「あだ名」を付けるように、データ型に新しい別名を付けることができます.
エイリアスの目的はプログラムの実行効率を高めるためではなく、符号化の便利さのためである.たとえば、stuという構造体の名前があります.構造体変数を定義するには、次のように書きます.
struct stu stu1;
structは余計に見えますが、書かないと間違いを報告します.struct stuに別名STUを付けたら、書くのは簡単です.
STU stu1;
この書き方はより簡潔で意味も明確で,標準ヘッダファイルでも今後のプログラミング実践でもこの別名が大量に用いられる.
キーワードの使用
typedef
タイプに新しい別名を付けることができます.構文のフォーマットは次のとおりです.
typedef oldName newName;
oldNameはタイプの元の名前で、newNameはタイプの新しい名前です.例:
typedef int INTEGER;
INTEGER a, b;
a = 1;
b = 2;
に等しい
.
typedefは、配列、ポインタ、構造体などのタイプに別名を定義することもできます.まず、配列タイプに別名を定義する例を見てみましょう.
typedef char ARRAY20[20];
ARRAY 20がタイプであることを示す
を選択します.長さ20の配列タイプです.次に、ARRAY 20を使用して配列を定義します.
ARRAY20 a1, a2, s1, s2;
これは次のようなものです.
char a1[20], a2[20], s1[20], s2[20];
配列にもタイプがあります.たとえば
配列a 1が定義されており、そのタイプはchar[20]であり、これはVIPチュートリアル「配列とポインタは決して等価ではなく、配列は別のタイプである」で説明されている.
」で説明されています.
たとえば、構造体タイプの別名を定義します.
typedef struct stu{
char name[20];
int age;
char sex;
} STU;
STUはstruct stuの別名で、STUで構造体変数を定義できます.
STU body1,body2;
これは次のようなものです.
struct stu body1, body2;
たとえば、ポインタタイプの別名を定義します.
typedef int (*PTR_TO_ARR)[4];
PTR_を表すTO_ARRはタイプ
の別名で、2 D配列ポインタタイプです.次にPTR_を使用することができるTO_ARRは2 D配列ポインタを定義します.
PTR_TO_ARR p1, p2;
同様の書き方で、関数ポインタのタイプに別名を定義することもできます.
typedef int (*PTR_TO_FUNC)(int, int); PTR_TO_FUNC pfunc;
【例】ポインタの別名を定義します.
#include
typedef char (*PTR_TO_ARR)[30];
typedef int (*PTR_TO_FUNC)(int, int);
int max(int a, int b){
return a>b ? a : b;
}
char str[3][30] = {
"http://c.biancheng.net",
「C言語中国語ネット」、"C-Language"
};
int main(){
PTR_TO_ARR parr = str;
PTR_TO_FUNC pfunc = max;
int i;
printf("max: %d", (*pfunc)(10, 20));
for(i=0; i<3; i++){
printf("str[%d]: %s", i, *(parr+i));
}
return 0;
}
実行結果:
max: 20
str[0]: http://c.biancheng.net
str[1]:C言語中国語ネットワーク
str[2]: C-Language
typedefは、新しいタイプを作成するのではなく、既存のタイプに新しい名前を付けることを強調する必要があります.「名を見て意を知る」ためには、できるだけ意味の明確な識別子を使用し、できるだけ大文字にしてください.
typedefと#defineの違い
typedefは、表現的にはdefineに似ている場合がありますが、マクロ置換との間に重要な違いがあります.この問題を正しく考える方法はtypedefを徹底的な「パッケージ」タイプと見なし、宣言後に他のものを増やすことはできない.
1)マクロタイプ名は、他のタイプの説明子を使用して拡張できますが、typedefで定義されたタイプ名では拡張できません.次のようになります.
#define INTERGE int unsigned INTERGE n;//大丈夫typedef int INTERGE;unsigned INTERGE n;//エラー、INTERGEの前にunsignedを追加できません
2)複数の変数を連続的に定義する場合、typedefは定義したすべての変数が同じタイプであることを保証し、#defineは保証できない.例:
#define PTR_INT int * PTR_INT p1, p2;
マクロの置換後、2行目は次のようになります.
int *p1, p2;
これにより、p 1、p 2は異なるタイプとなり、p 1はintタイプを指すポインタであり、p 2はintタイプである.
逆に、次のコードでは、
typedef int * PTR_INT PTR_INT p1, p2;
p 1,p 2タイプは同じで,intタイプへのポインタである.
エイリアスの目的はプログラムの実行効率を高めるためではなく、符号化の便利さのためである.たとえば、stuという構造体の名前があります.構造体変数を定義するには、次のように書きます.
struct stu stu1;
structは余計に見えますが、書かないと間違いを報告します.struct stuに別名STUを付けたら、書くのは簡単です.
STU stu1;
この書き方はより簡潔で意味も明確で,標準ヘッダファイルでも今後のプログラミング実践でもこの別名が大量に用いられる.
キーワードの使用
typedef
タイプに新しい別名を付けることができます.構文のフォーマットは次のとおりです.
typedef oldName newName;
oldNameはタイプの元の名前で、newNameはタイプの新しい名前です.例:
typedef int INTEGER;
INTEGER a, b;
a = 1;
b = 2;
INTEGER a, b;
に等しい
int a, b;
.
typedefは、配列、ポインタ、構造体などのタイプに別名を定義することもできます.まず、配列タイプに別名を定義する例を見てみましょう.
typedef char ARRAY20[20];
ARRAY 20がタイプであることを示す
char [20]
を選択します.長さ20の配列タイプです.次に、ARRAY 20を使用して配列を定義します.
ARRAY20 a1, a2, s1, s2;
これは次のようなものです.
char a1[20], a2[20], s1[20], s2[20];
配列にもタイプがあります.たとえば
char a1[20];
配列a 1が定義されており、そのタイプはchar[20]であり、これはVIPチュートリアル「配列とポインタは決して等価ではなく、配列は別のタイプである」で説明されている.
」で説明されています.
たとえば、構造体タイプの別名を定義します.
typedef struct stu{
char name[20];
int age;
char sex;
} STU;
STUはstruct stuの別名で、STUで構造体変数を定義できます.
STU body1,body2;
これは次のようなものです.
struct stu body1, body2;
たとえば、ポインタタイプの別名を定義します.
typedef int (*PTR_TO_ARR)[4];
PTR_を表すTO_ARRはタイプ
int * [4]
の別名で、2 D配列ポインタタイプです.次にPTR_を使用することができるTO_ARRは2 D配列ポインタを定義します.
PTR_TO_ARR p1, p2;
同様の書き方で、関数ポインタのタイプに別名を定義することもできます.
typedef int (*PTR_TO_FUNC)(int, int); PTR_TO_FUNC pfunc;
【例】ポインタの別名を定義します.
#include
typedef char (*PTR_TO_ARR)[30];
typedef int (*PTR_TO_FUNC)(int, int);
int max(int a, int b){
return a>b ? a : b;
}
char str[3][30] = {
"http://c.biancheng.net",
「C言語中国語ネット」、"C-Language"
};
int main(){
PTR_TO_ARR parr = str;
PTR_TO_FUNC pfunc = max;
int i;
printf("max: %d", (*pfunc)(10, 20));
for(i=0; i<3; i++){
printf("str[%d]: %s", i, *(parr+i));
}
return 0;
}
実行結果:
max: 20
str[0]: http://c.biancheng.net
str[1]:C言語中国語ネットワーク
str[2]: C-Language
typedefは、新しいタイプを作成するのではなく、既存のタイプに新しい名前を付けることを強調する必要があります.「名を見て意を知る」ためには、できるだけ意味の明確な識別子を使用し、できるだけ大文字にしてください.
typedefと#defineの違い
typedefは、表現的にはdefineに似ている場合がありますが、マクロ置換との間に重要な違いがあります.この問題を正しく考える方法はtypedefを徹底的な「パッケージ」タイプと見なし、宣言後に他のものを増やすことはできない.
1)マクロタイプ名は、他のタイプの説明子を使用して拡張できますが、typedefで定義されたタイプ名では拡張できません.次のようになります.
#define INTERGE int unsigned INTERGE n;//大丈夫typedef int INTERGE;unsigned INTERGE n;//エラー、INTERGEの前にunsignedを追加できません
2)複数の変数を連続的に定義する場合、typedefは定義したすべての変数が同じタイプであることを保証し、#defineは保証できない.例:
#define PTR_INT int * PTR_INT p1, p2;
マクロの置換後、2行目は次のようになります.
int *p1, p2;
これにより、p 1、p 2は異なるタイプとなり、p 1はintタイプを指すポインタであり、p 2はintタイプである.
逆に、次のコードでは、
typedef int * PTR_INT PTR_INT p1, p2;
p 1,p 2タイプは同じで,intタイプへのポインタである.