ホームページ >よくある問題 >typedef の用途は何ですか

typedef の用途は何ですか

DDD
DDDオリジナル
2023-06-07 10:38:105201ブラウズ

Typedef の使用法: 1. Typedef の基本データ型は「エイリアス」を取得します。C 言語のすべてのデータ型は typedef を使用して型名を再定義できます。2. Typedef はカスタム データ型の「エイリアス」を取得します。カスタマイズされたデータ型include: 構造体構造体名 { };、共用体ユニット名 { };、列挙 enum { }; 3. Typedef は配列の「エイリアス」を受け取ります; 4. Typedef はポインタの「エイリアス」を受け取ります。

typedef の用途は何ですか

#この記事の動作環境: Windows 10 システム、C 20 バージョン、dell g3 コンピューター。

実際のアプリケーションでは、typedef には主に次の 4 つの用途があります。

1) Typedef の基本データ型には「エイリアス」が必要です。
つまり、C 言語のすべてのデータ型は typedef キーワードを使用して型名を再定義できます

typedef unsigned int size;typedef unsigned int16 u16;typedef unsigned int8 u8;...
2) typedef はカスタム データ型の「エイリアス」を取得します
カスタム データ型には次のものが含まれます: 構造体名{ };、共用体ユニット名 { };、列挙 enum { };

struct students{
	char sex;
	char name[120];
	int ages;};
構造体のデータ名を再定義するために一般的に使用されるメソッドは次のとおりです:

struct students{
	char sex;
	char name[120];
	int ages;}std;std.name[20]="wujunwu"
さらに、typedef を使用して定義することもできます:

struct students{
	char sex;
	char name[120];
	int ages;};typedef struct students std;std.name[20]="wujunwu"
3) typedef は配列を受け取ります。 "alias"
typedef char arr_name[20];arr_name ane; ane[20]="wujunwu"
4) typedef はポインタの "alias" を受け取ります
通常のポインタ
int a=2;int* pointer;pointer =&a;
は同等ですto :

int a=2;typedef int* pointer;pointer p;p=&a;
a のデータ型が char、つまり char a =2 の場合、

char a=2;typedef int* pointer;pointer p;p=&(pointer)a;
関数ポインタ
typedef unsigned int bool;typedef bool(*pCopySDMMC2Mem)(int, unsigned int, unsigned short, unsigned int*, bool);typedef void (*pBL2Type)(void);pCopySDMMC2Mem p1=(pCopySDMMC2Mem)0xD0037F98;pBL2Type p2 = (pBL2Type)0x23E00000;
実際、上記のプログラムは 2 つのステップ:

最初のステップ: ポインターに「エイリアス」を与える

pCopySDMMC2Mem p1;pBL2Type p2;
第 2 ステップ: 強制的な型変換

(pCopySDMMC2Mem)0xD0037F98;  //真正在写代码时不能这样写(pBL2Type)0x23E00000;
3 番目のステップ:ポインターに値を割り当てる

p1=(pCopySDMMC2Mem)0xD0037F98;p2 = (pBL2Type)0x23E00000;
概要: typedef を使用する場合、typedef は新しい型を作成せず、プログラムで使用する既存の型の「エイリアス」を提供するだけです。

typedef のトラップ

次に、次のコードに示すように、単純な typedef の使用例を見てみましょう。

typedef char* PCHAR;int strcmp(const PCHAR,const PCHAR);
上記のコードでは、 は です。 「const PCHAR」は「const char*」と同等ですか?

答えは「いいえ」です。理由は非常に簡単です。Typedef は、型の新しいエイリアスを定義するために使用されます。これはマクロとは異なり、単純な文字列置換ではありません。したがって、「const PCHAR」のconstはポインタ全体に定数性を与え、定数ポインタ「char* const(charを指す定数ポインタ)」を形成します。つまり、実際には「const char* (定数 char へのポインタ)」ではなく、「char* const」と同等です。もちろん、次のコードに示すように、const PCHAR を const char* と等価にすることも簡単です。

typedef const char* PCHAR;int strcmp(PCHAR, PCHAR);
実際、ポインターに対して typedef が宣言される場合は常に、それは最終的な typedef に含める必要があります。 name const を追加してポインタ自体を定数にします。

typedef はオブジェクトのストレージ特性に実際には影響を与えませんが、auto、extern、static、register などのキーワードと同様に、構文上のストレージ クラス キーワードであることに注意することも重要です。 。したがって、次の宣言方法は実行できません。

typedef static int INT_STATIC;
実行できない理由は、typedef がすでにストレージ クラス キーワードの位置を占めているため、複数のストレージ クラス キーワードを宣言できないためです。宣言内で static またはその他のストレージ クラス キーワードを使用できなくなりました。もちろん、コンパイラはエラーも報告します。たとえば、VC 2010 のエラー メッセージは「複数のストレージ クラスを指定できません」です。

typedef與#define的差異:

(1)typedef所建立的符號名稱只限於類型,不限於值
(2)typedef由編譯器解釋,不是預處理器

typedef的四種用法

在實際應用中,typedef主要有以下四種用法:

1)typedef基本資料型別取「別名」

也就是說,C語言中的所有資料型別都可以用typedef關鍵字來重新定義型別名

typedef unsigned int size;typedef unsigned int16 u16;typedef unsigned int8 u8;...
2)typedef為自訂資料型別取「別名」

自訂的資料型別包括:結構體struct name{ }; 、共用體unit name { };、枚舉enum { };

struct students{
	char sex;
	char name[120];
	int ages;};

結構體重新定義資料名常用的方法有:

struct students{
	char sex;
	char name[120];
	int ages;}std;std.name[20]="wujunwu"

另外也可以用typedef定義:

struct students{
	char sex;
	char name[120];
	int ages;};typedef struct students std;std.name[20]="wujunwu"
3)typedef為陣列取「別名」
typedef char arr_name[20];arr_name ane; ane[20]="wujunwu"
4)typedef為指標取「別名」
#普通指標
int a=2;int* pointer;pointer =&a;

等同於:

int a=2;typedef int* pointer;pointer p;p=&a;

如果a的資料型別是char ,即char a =2;那麼,

char a=2;typedef int* pointer;pointer p;p=&(pointer)a;
#函數指標
typedef unsigned int bool;typedef bool(*pCopySDMMC2Mem)(int, unsigned int, unsigned short, unsigned int*, bool);typedef void (*pBL2Type)(void);pCopySDMMC2Mem p1=(pCopySDMMC2Mem)0xD0037F98;pBL2Type p2 = (pBL2Type)0x23E00000;

其實上面程式執行了兩步驟:
第一步:給指標取「別名」

pCopySDMMC2Mem p1;pBL2Type p2;

第二步:強制型別轉換

(pCopySDMMC2Mem)0xD0037F98;  //真正在写代码时不能这样写(pBL2Type)0x23E00000;

第三步:給指標賦值

p1=(pCopySDMMC2Mem)0xD0037F98;p2 = (pBL2Type)0x23E00000;

小結:使用typedef時,typedef並沒有建立任何新類型,它只是為某個已經存在的類型提供一個“別名”,以便在程式中使用。

typedef中的陷阱

接下來看一個簡單的typedef 使用範例,如下面的程式碼所示:

typedef char* PCHAR;int strcmp(const PCHAR,const PCHAR);

在上面的程式碼中,「const PCHAR」 是否相當於「const char*」 呢?

答案是否定的,原因很簡單,typedef 是用來定義一種類型的新別名的,它不同於宏,不是簡單的字串替換。因此,「const PCHAR」中的 const 給予了整個指標本身常數性,也就是形成了常數指標「char* const(一個指向char的常數指標)」。即它實際上相當於“char* const”,而不是“const char*(指向常數 char 的指標)”。當然,要讓const PCHAR 相當於const char* 也很容易,如下面的程式碼所示:

typedef const char* PCHAR;int strcmp(PCHAR, PCHAR);

其實,無論什麼時候,只要為指標宣告typedef,那麼就應該在最終的typedef 名稱中加一個const,以使得該指標本身是常數。

還需要特別注意的是,雖然typedef 並不真正影響物件的儲存特性,但在語法上它還是一個儲存類別的關鍵字,就像auto、extern、static 和register 等關鍵字一樣。因此,像下面這種聲明方式是不可行的:

typedef static int INT_STATIC;

不可行的原因是不能聲明多個儲存類別關鍵字,由於typedef 已經佔據了儲存類別關鍵字的位置,因此,在typedef聲明中就無法再使用static 或任何其他儲存類別關鍵字了。當然,編譯器也會報錯,如在 VC 2010 中的報錯資訊為「無法指定多個儲存類別」。

以上がtypedef の用途は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。