一句話幫你理解 typedef 的用法

2019-09-19 14:20 ? 次閱讀

前言

在C語言中typedef用來給復雜聲明定義別名非常的方便,不過有時候typedef在復雜聲明中不好理解。本文關鍵的一句話幫你理解ytpedef的用法。

typedef常見應用場景

在這之前,我們來看看一些常見應用場景。

為特定含義的類型取別名

例如,假設速度是整型值:

typedef?int?SpeedType;

那么你就可以像下面這樣使用了:

#include
typedef?int?SpeedType;
int?main(void)
{
????SpeedType?s?=?10;
????printf("speed?is?%d?m/s",s);
????return?0;
}

在main函數中,你可以直接使用SpeedType作為一種類型來定義變量了。有人可能問了,為什么要這樣,直接使用int不是更好嗎?那么如果你的代碼中很多地方都用到了這個,但是突然有一天不再使用int,而是使用long呢?是不是直接修改typedef部分就可以了?(當然打印的地方也需要變,可自定義打印函數),另外一方面,通過SpeedType這個名字就可以非常直接的讀懂變量的含義。

事實上,size_t,socklen_t等類型都是類似的定義。

說到typedef,就需要提一下define了,define只是一個字符串簡單替換。當然下面這樣的例子你可能見過很多次了:

#define?PIONTER?int*
PIONTER?a,b;?//等同于int*?a,b;
typedef?int*?POINTER1
POINTER1?c,d;//等同于int?*c;int?*d;

為結構體取別名

這個也比較常見,不過有的人認為,為結構體取別名并不是一個明智的選擇,因為它在使用的時候不能直觀看到它是結構體類型了。

struct?info
{
????char?name[128];
????int?length;
};

那么你在聲明變量的時候,需要帶上struct,即像下面這樣使用:

struct?info?var;

但是如果你用typedef取個別名呢?

typedef?struct?info
{
????char?name[128];
????int?length;
}Info;

你就可以像下面這樣使用了:

Info?var;

聲明函數指針類型

前面的都很好理解,那么來看看函數指針:

typedef?void*(*Fun)(int,int);

這里將返回類型為void *,入參為int的函數類型命名為Fun,那么在其他地方,就可以像下面這樣使用啦:

//來源:公眾號【編程珠璣】,博客地址:https://www.yanbinghu.com
#include?
typedef?void*(*Fun)(int,int);
void?*test(int?a,int?b)
{
????printf("%d,%d
",a,b);
????//do?something
????return?NULL;
}
int?main(void)
{
????Fun?myfun?=?test;//這里的Fun已經是一種類型名了
????myfun(1,1);
????return?0;
}

是不是發現跟前面的不一樣了呢?類型別名的位置飄忽不定,有的在最后,有的在中間。

當然typedef的場景并不限于以上幾種,這里僅僅是舉例。

一句話理解

我不知道你是不是已經完全理解了前面的場景,無論理解與否,這句話都能很好的幫助你再次理解前面的內容:

typedef中聲明的類型在變量名的位置出現

什么意思呢,我們回頭來看。我們是怎么聲明int類型變量的?

int?Typename;

像上面這樣,對不對?那么用typedef之后呢?把變量名的位置替換為別名:

typedef?int?Typename;

好了,你現在已經把為int取別名為Typename。

再來看結構體,聲明普通結構體變量:

struct?info
{
????char?name[128];
????int?length;
};
struct?info?Typename;

用typedef取別名,別名取代變量名的位置:

struct?info
{
????char?name[128];
????int?length;
};
typedef?struct?info?Typename;

好了,你現在已經為struct info取別名為Typename。
當然這可能我們平常通常使用下面這種寫法:

typedef?struct?info
{
????char?name[128];
????int?length;
}Typename;

再來看函數指針類型,我們平常是如何聲明函數的?

void?*function(int,int);

那么使用typedef取別名呢?用別名取代函數名的位置即可:

void?*(*Fun)(int,int);

不過這里需要注意用括號將這個別名括起來,并在前面加*號。

總結

至此,相信你對typedef的使用有了更清晰的認識了。

收藏 人收藏
分享:

評論

相關推薦

LCD1602萬年歷的按鍵控制光標閃爍出錯該怎么辦?

菜鳥一枚,剛用DS1302和LCD1602做了個萬年歷,Key1為設置鍵,每按一下光標定位到年、月、日、星期、時、分、秒處閃爍,mai...
發表于 10-15 00:31 ? 145次 閱讀
LCD1602萬年歷的按鍵控制光標閃爍出錯該怎么辦?

為什么ucos工程下的main函數只加一個空循環?

編譯出來的代碼也有好幾K啊?
發表于 10-14 01:53 ? 21次 閱讀
為什么ucos工程下的main函數只加一個空循環?

請問我理解的volatile用法有沒有錯?

volatile的用法 文章一: 由于訪問寄存器的速度要快過RAM,所以編譯器一般都會作減少存取外部RAM的優化。比如: static...
發表于 10-13 20:18 ? 20次 閱讀
請問我理解的volatile用法有沒有錯?

如何理解Linux系統唯一一個main函數?

我一直都覺得操作系統是一個死循環,學習單片機的時候,自己寫一個main函數(沒有操作系統)的是相對容易的,到了學習STM32即使...
發表于 09-29 08:59 ? 80次 閱讀
如何理解Linux系統唯一一個main函數?

為什么我的畢業班第一課自己寫bootloader會變成這樣?

跟著老師一起寫完后,老師改的也改了,燒寫后成這樣子。 自己感覺連MAIN函數都沒進去。。。 附件:后面附有自己的代碼...
發表于 09-23 05:45 ? 108次 閱讀
為什么我的畢業班第一課自己寫bootloader會變成這樣?

請問如何在main函數之前設置看門狗?

大家好,我的程序在nandflash上電有一定幾率不能執行,main函數的前兩行是串口配置和打印一行信息,main函數的最后設置了一個看門...
發表于 09-18 13:11 ? 83次 閱讀
請問如何在main函數之前設置看門狗?

請問單片機在執行main函數之前要做哪些工作?

單片機在執行main函數之前都做了哪些工作?是不是還有別的工作先做了?main并不是最先執行的程序?...
發表于 09-05 04:35 ? 146次 閱讀
請問單片機在執行main函數之前要做哪些工作?

請問我能找到程序源碼中的已經移植好UCOS的程序來改main函數嗎?

請問如果我要移植UCOS到STM32mini板上,能否找到程序源碼中的某一個已經移植好UCOS的程序來改main函數,或者說將其作...
發表于 08-19 03:06 ? 92次 閱讀
請問我能找到程序源碼中的已經移植好UCOS的程序來改main函數嗎?

LCD多級菜單還有哪些問題?

最近在做一個多級菜單項目,看了很多資料,大體分兩種設計思路:1、通過雙向鏈表實現;2、通過數組實現。思路無非是把菜單聯系起...
發表于 08-18 16:23 ? 307次 閱讀
LCD多級菜單還有哪些問題?

請問如果main不返回那需要設置棧嗎?

裸機第二個例子,如果main不返回,需要設置棧嗎? 匯編程序: .text .global _start _start:       ...
發表于 08-13 05:38 ? 142次 閱讀
請問如果main不返回那需要設置棧嗎?

淺析typedef函數指針用法

首先我們根據前面提到的“形式1”認識到它是一個指向某種函數的指針,這種函數參數是一個int型,返回值....
的頭像 單片機愛好者 發表于 11-02 10:38 ? 1013次 閱讀
淺析typedef函數指針用法

如何解決STM32調試無法進入main函數的問題?

本文主要詳細介紹了怎么解決STM32調試無法進入main函數的問題?
的頭像 玩轉單片機 發表于 10-05 10:06 ? 2803次 閱讀
如何解決STM32調試無法進入main函數的問題?

C語言程序的main函數免費下載

本文檔的主要內容詳細介紹的是C語言程序的main函數免費下載。
發表于 09-26 14:48 ? 181次 閱讀
C語言程序的main函數免費下載

淺談C語言return語句和main 函數的返回值

在函數中,如果碰到return 語句,那么程序就會返回調用該函數的下一條語句執行,也就是說跳出函數的....
發表于 05-10 10:53 ? 1836次 閱讀
淺談C語言return語句和main 函數的返回值

Typedef的用途和原聲明舉例及陷阱分析

typedef是一種在計算機編程語言中用來聲明自定義數據類型,配合各種原有數據類型來達到簡化編程的目....
發表于 04-14 07:34 ? 440次 閱讀
Typedef的用途和原聲明舉例及陷阱分析

typedef和define的介紹及本質區別

對于都可以用來給對象取一個別名的Typedef和define來說,是有區別的。本文通過對typede....
發表于 04-14 07:31 ? 655次 閱讀
typedef和define的介紹及本質區別

NB991_MAIN10W

NB991_MAIN10W
發表于 12-11 16:31 ? 217次 閱讀
NB991_MAIN10W

單片機編程的基本思路和寫法

學習單片機最主要的是學習寫程序的方法,程序的功能千變萬化,是學不完的,只有掌握了一定方法,才能用這種....
發表于 11-14 09:17 ? 696次 閱讀
單片機編程的基本思路和寫法

typedef struct的用法

typedef是類型定義的意思。typedef struct 是為了使用這個結構體方便。具體區別在于....
發表于 11-09 17:20 ? 499次 閱讀
typedef struct的用法

typedef結構體定義

typedef為這個新的結構起了一個名字,叫MyStruct。typedef struct tagM....
發表于 11-09 16:55 ? 1022次 閱讀
typedef結構體定義

typedef的用法

typedef 有一個重要的用途,那就是定義機器無關的類型,例如,你可以定義一個叫 REAL 的浮點....
發表于 11-09 16:32 ? 673次 閱讀
typedef的用法

c語言中typedef的用法

C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲....
發表于 11-09 15:23 ? 1825次 閱讀
c語言中typedef的用法

typedef和define區別

typedef是在計算機編程語言中用來為復雜的聲明定義簡單的別名,與宏定義有些差異。它本身是一種存儲....
發表于 11-09 14:22 ? 2471次 閱讀
typedef和define區別

typedef是什么意思

typedef是在計算機編程語言中用來為復雜的聲明定義簡單的別名,與宏定義有些差異。它本身是一種存儲....
發表于 11-09 14:03 ? 1743次 閱讀
typedef是什么意思

Typedef用法小結

非常不錯的文檔有著基本數據類型結構體enum與函數指針等等的Typedef相關用法.
發表于 06-15 15:46 ? 227次 閱讀
Typedef用法小結

main

很不錯
發表于 03-20 08:00 ? 169次 閱讀
main

typedef_struct_用法詳解和用法小結

發表于 11-13 13:16 ? 323次 閱讀
typedef_struct_用法詳解和用法小結
成人影片-成人片