C語言中的typedef



C typedef

C程式語言提供了一個名為typedef的關鍵字,用於為現有的資料型別設定一個替代名稱。C語言中的typedef關鍵字在為內建資料型別以及任何派生資料型別(如結構體、聯合體或指標)分配一個方便的別名方面非常有用。

有時,每次宣告變數時使用較長的名稱(例如“struct structname”或“unsigned int”)的資料型別會變得很麻煩。在這種情況下,我們可以分配一個方便的快捷方式,使程式碼更具可讀性。

typedef語法

通常,typedef關鍵字的使用方式如下:

typedef existing_type new_type;

typedef示例

在本章中,讓我們看一下typedef的一些用例。

示例1

在C語言中,關鍵字“unsigned”用於宣告只能儲存非負值的無符號整數變數

C還有一個名為“short”的關鍵字,它宣告一個佔用2個位元組記憶體的整數資料型別。如果要宣告一個既是short又只能具有非負值的變數,則可以組合這兩個關鍵字(unsigned和short)

short unsigned int x;

如果要宣告許多此型別的變數,則每次都使用這三個關鍵字將不太方便。相反,您可以使用typedef關鍵字定義一個別名或快捷方式,如下所示:

typedef short unsigned int USHORT;

這告訴編譯器識別符號USHORT對應於“short unsigned int”型別。此後,您可以在變數宣告語句中使用USHORT

USHORT x;

示例2

C還具有關鍵字static,用於指示此類變數僅初始化一次。“long”關鍵字在64位系統上分配8個位元組來儲存整數。我們可以如下宣告此型別的變數:

static unsigned long x;

但是,我們不能在“typedef”語句中使用關鍵字“static”,但是我們可以使用typedef為這種型別的宣告分配一個快捷別名:

typedef signed long SLONG;
static SLONG x;

注意:按照約定,別名以大寫字母表示,只是為了區分內建型別和使用的別名。

示例3

以下示例演示瞭如何在C程式中使用別名:

#include <stdio.h>

int main() {
   typedef short unsigned int USHORT;
   typedef signed long int SLONG;

   static SLONG x = 100;
   USHORT y = 200;

   printf("Size of SLONG: %d \nSize of USHORT: %d", sizeof(SLONG), sizeof(USHORT));
   
   return 0;
}

輸出

執行此程式碼時,將產生以下輸出:

Size of SLONG: 8 
Size of USHORT: 2

使用Typedef定義結構體

通常,我們需要透過在宣告語句中新增struct_type的名稱字首來宣告結構體變數,如下所示:

struct struct_type var;

如果以這種方式編寫型別名稱感覺很麻煩,則可以使用typedef分配一個別名:

typedef struct struct_type ALIAS;

示例

在此示例中,我們定義了一個結構體型別,然後使用typedef關鍵字為其設定一個別名:

#include <stdio.h>

int main() {

   typedef unsigned long int ULONG;
   typedef short int SHORT;

   struct mystruct {
      ULONG a;
      SHORT b;
   };

   typedef struct mystruct STR;
   STR s1 = {10, 20};
   printf("%ld %u", s1.a, s1.b);

   return 0;
}

輸出

執行程式碼並檢查其輸出:

10 20

可以使用typedef關鍵字的另一種方法。我們可以將其與結構體定義本身結合起來,如下所示:

typedef struct mystruct {
   ULONG a;
   SHORT b;
} STR;

STR s1 = {10, 20};

結構體指標的Typedef

typedef關鍵字也可用於為任何指標型別分配新的識別符號。通常,我們如下宣告指標變數:

struct mystruct * x;

相反,我們可以使用typedef關鍵字,如下所示:

typedef struct mystruct {
   ULONG a;
   SHORT b;
} STR;

typedef STR * strptr;

它允許您以更簡潔的方式宣告此型別的指標:

strptr ptr;

然後,我們可以將相應struct變數的地址分配給指標。

示例

以下示例顯示瞭如何使用typedef建立結構體指標:

#include <stdio.h>

int main() {

   typedef unsigned long int ULONG;
   typedef short int SHORT;

   typedef struct mystruct {
      ULONG a;
      SHORT b;
   } STR;

   STR s1 = {10, 20};
   typedef STR * strptr;
   strptr ptr = &s1;

   printf("%d %d \n", s1.a, s1.b);
   printf("%d %d", ptr->a, ptr->b);

   return 0;
}

輸出

執行此程式碼時,將產生以下輸出:

10 20 
10 20

聯合體的Typedef

我們可以使用typedef關鍵字為任何聯合體型別分配快捷別名。

示例

以下示例說明了如何在建立聯合體時使用typedef

#include <stdio.h>

int main() {

   typedef unsigned long int ULONG;
   typedef short int SHORT;

   typedef union myunion {
      char a;
      int b;
      double c;
   } UNTYPE;

   UNTYPE u1;
   u1.c = 65.50;

   typedef UNTYPE * UNPTR;
   UNPTR ptr = &u1;

   printf("a:%c b: %d c: %lf \n", u1.a, u1.b, u1.c);
   printf("a:%c b: %d c: %lf \n", ptr->a, ptr->b, ptr->c);

   return 0;
}

輸出

執行程式碼並檢查其輸出:

a: b: 0 c: 65.500000
a: b: 0 c: 65.500000

C語言中的typedef與#define

typedef關鍵字經常與#define指令混淆。在C語言中,#define預處理器指令。它是定義常量的一種有效方法。

使用#define語法如下:

#define name value

例如:

#define PI 3.14159265359

#define語句也可用於定義宏:

#define SQUARE(x) x*x

宏的工作原理類似於函式。但是,在呼叫時,值會在預處理器級別被替換。

printf("%d", SQUARE(5));

#define是預處理器指令,而typedef在編譯時進行評估。

  • typedef僅限於為型別賦予符號名稱。#define也可用於為值定義別名。例如,您可以將“1”定義為“ONE”。
  • typedef的解釋由編譯器執行,而#define語句由預處理器處理。

示例

在以下程式碼中,我們同時使用了這兩個功能(typedef#define):

#include <stdio.h>
#define MAX 10

int main() {

   typedef unsigned long int ULONG;
   typedef short int SHORT;

   typedef struct employee {
      char name[MAX];
      int age;
   } EMP;

   EMP e1 = {"Krishna", 25};
   printf("Name: %s \nAge: %d", e1.name, e1.age);

   return 0;
}

輸出

執行此程式碼時,將產生以下輸出:

Name: Krishna 
Age: 25
廣告

© . All rights reserved.