C 語言中的 typedef 和 #define

有時候爲了代碼的可移植和跨平臺的開發,或者是爲了縮短書寫字符,會使用 typedef 進行類型重命名。

typedef

作用

用自定義名稱爲已有數據類型命名。

定義爲:

typedef  datatype  name;

使用方法

爲了便於記憶,可以歸納爲步驟:

  1. 先用已有類型定義一個變量

  2. 在定義語句類型前加 typedef

  3. 將變量名換成自定義名稱

  4. 最後一定有分號;

看下邊的程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef int TYPE32;
typedef int ARRAY[10];
typedef char *POINTER;
typedef char *POINTERARRAY[3];

int main()
{
    TYPE32 a = 10;
    ARRAY arr = {1,2,3,4,5,6,7,8,9,10};
    POINTER ps= "123";
    POINTERARRAY pt= {"123","456","789"};

    printf("sizeof(TYPE32) = %d\n",sizeof(TYPE32));
    printf("sizeof(ARRAY) = %d\n",sizeof(ARRAY));
    printf("sizeof(POINTER) = %d\n",sizeof(POINTER));
    printf("sizeof(POINTERARRAY) = %d\n",sizeof(POINTERARRAY));
    putchar(10);

    printf("a = %d\n",a);
    putchar(10);
    for (int i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
        printf("arr[%d] = %d\n",i,arr[i]);
    putchar(10);
    printf("a = %s\n",ps);
    putchar(10);
    for (int i = 0;i<sizeof(pt)/sizeof(pt[0]);i++)
        printf("arr[%d] = %s\n",i,pt[i]);

    return 0;
}

結果爲:

sizeof(TYPE32) = 4
sizeof(ARRAY) = 40
sizeof(POINTER) = 4
sizeof(POINTERARRAY) = 12

a = 10

arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 4
arr[4] = 5
arr[5] = 6
arr[6] = 7
arr[7] = 8
arr[8] = 9
arr[9] = 10

a = 123

arr[0] = 123
arr[1] = 456
arr[2] = 789

主要是關於數組的 typedef。不要搞混淆了。

#define

作用

#define 只是在預處理階段進行文本替換,使用格式爲:

#define  源文本  替換文本

有時候 typedef 和 #define 的作用會一樣,但有時卻有很大差別。看下邊的程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef char *POINTER;
#define POINTERD char *

int main()
{
    POINTER pa,pb;
    printf("sizeof(POINTER) = %d\n",sizeof(POINTER));
    printf("sizeof(pa) = %d sizeof(pb) = %d\n",
           sizeof(pa),sizeof(pb));

    POINTERD pc,pd;
    printf("sizeof(POINTERD) = %d\n",sizeof(POINTERD));
    printf("sizeof(pc) = %d sizeof(pd) = %d\n",
           sizeof(pc),sizeof(pd));

    return 0;
}

結果爲:

sizeof(POINTER) = 4
sizeof(pa) = 4 sizeof(pb) = 4
sizeof(POINTERD) = 4
sizeof(pc) = 4 sizeof(pd) = 1

從上邊的結果可以看出:

  • typedef 是一個語句,句尾有分號
  • #define 是一個宏,並不是完整的語句
  • typedef 只能給已經存在的類型起別名,不能無中生有構造新類型
  • 宏 define 是在預處理的時候完成的,typedef 則是在編譯時完成的,相比下 typedef 更好用
  • 一般情況下,重新命名的類型習慣用大寫表示,以示區分
  • 有時我們會將某些結構簡單的函數進行宏定義,進行代碼嵌套,從而減少代碼冗餘,減少調用開銷,但也會造成編譯文件過大
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章