C語言中typedef與define的這些區別值得關注

2020-12-20 C語言知識傳播者
請看下文

C語言中typedef與define有些功能有點類似,比如它們均可以給一個對象取個別名。因此也讓許多初學者產生迷惑,分不清楚到底有什麼區別,今天作者來總結一下供大家參考,看了本文相信大家能夠掌握。

1、 從功能上來說有不同

define指令用於宏定義,可以提高原始碼的可讀性,為編程提供方便,一般放在源文件的前面部分。

typedef用來定義自己習慣使用的數據類型名稱,可以替代自己所熟悉的基本類型、數組類型、指針類型以及自己定義的結構體類型、共用體類型、枚舉類型等。一旦我們在程序中使用typedef定義了自己的數據類型名稱,我們就可以像使用int、float和double等基本數據類型一樣來使用它。

2、 從處理時機來說有不同

define是預處理指令,並不是編譯過程中處理,而是在編譯之前就已經完成了。它只是簡單而機械的字符串替換,並不做正確性檢測,若有錯誤,只能在編譯這些已經展開的源程序時才能夠被發現並報錯。

typedef所定義的新名字具有一定的封裝性,是在程序編譯階段處理的,編譯時有類型檢測功能。但它並不實際分配內存空間。

3、 從具體用法來說有不同

define用於定義常量、變量、編譯開關等。詳細用法請見作者的另一篇文章,名為「C語言中的define預處理指令老手都是這樣用,你全都掌握了嗎?」,本文不再贅述。

typedef用於為不同數據類型定義新名字,詳細用法請見作者的另一篇文章,名為「C語言中typedef用法總結,看完就能像編程老手一樣熟練運用」,本文不再贅述。

4、從對指針的操作來說有不同

define和typedef兩者都可以定義指針類型,但使用定義後的類型名去定義變量時,結果有差異。定義如下:

#define PCHAR1 char*

typedef char* PCHAR2;

(1) 指針差異1,直接定義變量

舉例說明如下:

PCHAR1 pc1, pc2;

PCHAR2 pc3, pc4;

上面兩行語句目的是想把pc1、pc2、pc3、pc4都定義成指向char型數據的指針,結果pc2不符合定義成指針的預期,其實際為char型普通變量,其它三個為指針變量,符合預期。

為什麼導致這個結果呢?原因很簡單,define就是一個宏定義,在編譯預處理階段直接字符串替換,直接將PCHAR1替換成char*,替換後變成如下形式:

char * pc1, pc2;

很顯然,pc1是指針變量,pc2為普通變量。

(2) 指針差異2,與const修飾符連用。

舉例說明如下:

char c1=『A』;

char c2=『B』;

char c3=『C』;

const PCHAR1 pc5; //語句1

const PCHAR2 pc6=&c2; //語句2

語句1中,const限定的是指針變量pc5所指向空間的值,即空間的值不可被更改;但指針變量pc5的值可以更改,即其可以指向其它空間。

語句2中,const限定的是指針變量pc6的值,即pc6的值不可更改;但其所指向空間的值是可以更改的。通常在語句2中需要給pc6賦初值,否則編譯時會有警告,提示所使用的pc6未初始化。

導致此差異的原因依然是define只是簡單的字符串替換,語句1實際上是如下形式:

const char * pc5; //語句1

如果按照語句2形式的定義,想要用const限定空間的值,而不是限定指針,只需要重新定義PCHAR2即可,定義可修改為如下形式:

typedef const char* PCHAR2;

關於typedef與define的用法區別今天就總結到這,如果大家有任何疑問請留言探討。我是「C語言知識傳播者」,志在瞄準C語言,挖掘和總結C語言的難點和痛點,給C語言編程愛好者和本領域從業人員提供參考,我會用心總結C語言知識的點點滴滴,你的關注是我持續創作的動力,請關注我,收藏本文、轉發並點讚,希望得到你們的持續關注,謝謝!

相關焦點

  • C語言#define和typedef的用法區別,以及陷阱
    編排 | strongerHuang微信公眾號 | 嵌入式專欄在C語言編程中,typedef 和 #define是最常用語句,可能很多工作過幾年的工程師都沒有去深究過它們的一些用法和區別。在C/C++語言中,typedef常用來定義一個標識符及關鍵字的別名,它是語言編譯過程的一部分,但它並不實際分配內存空間,比如:typedef int INT;typedef  (int*)   pINT;typedef unsigned int uint32_ttypedef可以增強程序的可讀性,以及標識符的靈活性,但它也有
  • C語言typedef VS define,孰優孰劣?
    typedefC 語言提供了 typedef關鍵字,您可以使用它來為類型取一個新的名字。書 ID : 12345define一般用法:#define 標識符字符串在預編譯過程中,將標識符替換為字符串#define是 C 指令,用於為各種數據類型定義別名
  • typedef和#define的用法、區別,以及陷阱
    素材來源:網絡編輯整理:strongerHuang在C語言編程中,typedef 和 #define是最常用語句,可能很多工作過兩三年的工程師都沒有去深究過它們的一些用法和區別
  • typedef用法 與#define
    但是值得注意的是,它並不定義新的類型,而是對已有的類型定義一個其他的名字。本人生就略愚,常常搞不清與#define的關係,難道僅僅是所定義得到的新類型所在的位置不同嗎?首先我們仔細看看typedef。這樣,雖然代碼中使用了浮點類型REAL,但並不會給不同類性的機器代理不兼容的問題。 typedef可以增強程序的可讀性,以及標識符的靈活性,但是它也有「非直觀性」等缺點。二、#define的用法#define為一個宏定義語句,通常它用來定義常量(包括無參量與帶參量),以及用來實現那些「表面似和善,背後一長串」的宏(很是形象)。
  • typedef和#define的用法、區別以及陷阱!
    在C語言編程中,typedef和#define是最常用語句,可能很多工作過兩三年的工程師都沒有去深究過它們的一些用法和區別。
  • C語言之類型定義(typedef)
    我們知道C語言定義數據類型的時候只定義了它們之間的關係,但卻沒有具體定義它們的大小。比如 short 的長度只規定了不大於 int,long的長度不小於 int,int是多大也沒確定,所以你會看到51單片機的int大小為兩個字節,而在stm32中的長度為 4 字節。
  • 如何寫出高效優美的單片機C語言代碼?
    7、查表在程序中一般不進行非常複雜的運算,如浮點數的乘除及開方等,以及一些複雜的數學模型的插補運算,對這些即消耗時間又消費資源的運算,應儘量使用查 表的方式,並且將數據表置於程序存儲區。如果直接生成所需的表比較困難,也儘量在啟了,減少了程序執行過程中重複計算的工作量。
  • 關於typedef的用法總結
    與 #define的區別:  案例一:  通常講,typedef要比#define要好,特別是在有指針的場合。請看例子:  typedef char*pStr1;  #define pStr2char *;  pStr1 s1, s2;  pStr2 s3, s4;  在上述的變量定義中,s1、s2、s3都被定義為char *,而s4則定義成了char,不是我們  所預期的指針變量,根本原因就在於#define只是簡單的字符串替換而
  • 總結嵌入式開發中的C語言知識點
    #endif等)平臺擴展關鍵字(__asm, __inline,__syscall)    這些關鍵字共同構成了嵌入式平臺的C語言語法,嵌入式的應用從邏輯上可以抽象為以下三個部分:    貫穿在整個嵌入式應用開發的過程中,對數據的管理包含以下幾部分:    為了應對嵌入式開發中受限的資源環境,C語言從語法上支撐上述功能的實現,並提供相應的優化機制
  • Obj-C 中的 Boolean
    ⚠️ 注意:為了避免讀者(和筆者)記混,這裡簡單說明下 #define 與 typedef 的異同:#define A B 意為將已存在的 B 定義為 A,A 與 B 等價;typedef C D 意為將已存在的 C 定義為 D,C 與 D 等價;後者通常用於類型定義。
  • struct和typedef struct
    變量名    在c++中可以有    (1)struct tagMyStruct 變量名    (2)MyStruct 變量名    (3)tagMyStruct 變量名typedef struct與struct的區別1.
  • C語言中typedef用法總結,看完就能像編程老手一樣熟練運用
    請看下文C語言中typedef關鍵字應用比較常見,許多C語言初學者對它的用法不甚了解。事實上,我們可以用typedef來定義自己習慣使用的數據類型名稱,可以替代自己所熟悉的基本類型、數組類型、指針類型以及自己定義的結構體類型、共用體類型、枚舉類型等。一旦我們在程序中定義了自己的數據類型名稱,我們就可以像使用int、float和double等基本數據類型一樣來使用它。實際使用中,typedef有以下幾種主要形式。
  • 為什麼很多人編程喜歡用typedef?如何避免濫用?
    C語言中已經存在的一個類型起一個新名字。而在C++語言中,則不需要這麼做,直接使用:結構體名 變量名就可以了struct student{char name[20];int age;float score; };int main (void){ student stu = {"wit", 20, 99};return 0;}如果我們使用typedef,就可以給student
  • C語言編程核心要點
    類型C是強類型語言,有short、long、int、char、float、double等build-in數據類型,類型是貫穿c語言整個課程的核心概念。struct、union、enum屬於c的構造類型,用於自定義類型,擴充類型系統。變量變量用來保存數據,數據是操作的對象,變量的變字意味著它可以在運行時被修改。
  • C語言基礎知識學習經典入門
    >11 C語言函數指針... 612 C語言typedef關鍵字... 613 C語言面向對象 – 思維方式... 714 C語言引入自定義頭文件... 915 C語言字符串操作 - sprintf 1016 C語言文件操作 – fprintf、 fread. 1017 C語言實現猜數字小遊戲... 11
  • c語言之共用體union、枚舉、大小端模式
    上一個專題我們詳細的分享了c語言裡面的結構體用法,讀者在看這些用法的時候,可以一邊看一邊試驗,掌握了這些基本用法就完全夠用了,當然在以後的工作中
  • 單片機C語言的一些誤用和知識
    我絕得語言之所以能稱之為語言,它肯定是一種工具一種相互交流相互通信相互傳達之間的意圖的工具,作為語言那肯定得有自己的語法,要想相互交流肯定得先學好它的語法吧(比如像表達式,函數,循環,指針)我稱之為C語言的語法。C語言雖然很強大但是他也有不少陷阱,所以我發這篇帖子有兩個目的:一是把C語言一些誤用易錯的地方總結一下,二是把C語言一些基本語法總結一下。
  • C語言宏定義
    #define N 100就是宏定義,N為宏名,100是宏的內容。在編譯預處理時,對程序中所有出現的「宏名」,都用宏定義中的字符串去代換,這稱為「宏代換」或「宏展開」。宏定義是由源程序中的宏定義命令#define完成的,宏代換是由預處理程序完成的。
  • 【C語言經典編程技術】C語言中union與struct的區別及sizeof的計算方式
    C語言中union與struct的區別在C語言中結構體和聯合具有細微差別,特別是使用sizeof()對其求大小時,許多剛剛接觸
  • 圖文並茂,一次搞定C語言結構體內存對齊!(包含完整源碼)
    這些內容不用記住,不同平臺是不一樣的,使用之前,一定要親自測試驗證下,但是可以總結出以下信息:void類型不是空的,佔一個字節long不一定比int大C語言空結構體的大小為0(注意:C++的為1)不管什麼類型,指針都是相同大小的#define offset(type, member)