日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

              歡迎訪問 生活随笔!

              生活随笔

              當前位置: 首頁 >

              typedef VS #define —— C语言中的 关键字 与 C指令

              發布時間:2025/10/17 50 豆豆
              生活随笔 收集整理的這篇文章主要介紹了 typedef VS #define —— C语言中的 关键字 与 C指令 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

              *******************************************typedef*****************************************************************

              ********************************************************************************************************************

              C 語言提供了?typedef?關鍵字,您可以使用它來為類型取一個新的名字。

              ?

              typedef unsigned char BYTE; unsigned char BYTE;

              在這個類型定義之后,標識符 BYTE 可作為類型?unsigned char?的縮寫,例如:

              BYTE b1, b2;, b2;

              您也可以使用?typedef?來為用戶自定義的數據類型取一個新的名字。例如,您可以對結構體使用 typedef 來定義一個新的數據類型名字,然后使用這個新的數據類型直接定義結構變量,如下:

              #include <stdio.h> #include <string.h>typedef struct Books {char title[50];char author[50];char subject[100];int book_id; } Book;int main( ) {Book book;strcpy( book.title, "C 教程");strcpy( book.author, "Runoob"); strcpy( book.subject, "編程語言");book.book_id = 12345;printf( "書標題 : %s\n", book.title);printf( "書作者 : %s\n", book.author);printf( "書類目 : %s\n", book.subject);printf( "書 ID : %d\n", book.book_id);return 0; }

              ?

              *******************************************#defiene*****************************************************************

              ********************************************************************************************************************????? ??

              #define?是 C 指令,用于為各種數據類型定義別名,與?typedef?類似,但是它們有以下幾點不同

              #include <stdio.h>#define TRUE 1 #define FALSE 0int main( ) {printf( "TRUE 的值: %d\n", TRUE);printf( "FALSE 的值: %d\n", FALSE);return 0; }

              解釋:

              ????? ? 這里將TRUE定義為一個要被1取代的符號。用TRUE而不用true是因為,在C語言中有一個通用的約定:#define語句中的表示符都是大寫。

              宏定義:

              1、數值宏常量

              因為編譯器會在預編譯的時候用真身替換替身,而
              在我們的代碼里面卻又用常常用替身來幫忙??蠢?#xff1a;
              #define PI 3.141592654
              在此后的代碼中你盡可以使用 PI 來代替 3.141592654,而且你最好就這么做。不然的話,如
              果我要把 PI 的精度再提高一些,你是否愿意一個一個的去修改這串數呢?你能保證不漏不
              出錯?而使用 PI 的話,我們卻只需要修改一次。這種情況還不是最要命的,我們再看一個
              例子:
              #define ERROR_POWEROFF -1
              如果你在代碼里不用 ERROR_POWEROFF 這個宏而用-1,尤其在函數返回錯誤代碼的時候
              (往往一個開發一個系統需要定義很多錯誤代碼)。肯怕上帝都無法知道-1 表示的是什么意
              思吧。這個-1,我們一般稱為“魔鬼數”,上帝遇到它也會發狂的。所以,我奉勸你代碼里
              一定不要出現“魔鬼數”

              2、字符串宏常量

              除了定義宏常數之外,經常還用來定義字符串,尤其是路徑:
              噢,到底哪一個正確呢?如果路徑太長,一行寫下來比較別扭怎么辦?用反斜杠接續符啊:
              C), #define ENG_PATH_3 E:\English\listen_to_this\listen\
              _to_this_3
              還沒發現問題?這里用了 4 個反斜杠,到底哪個是接續符?回去看看接續符反斜杠。
              反斜杠作為接續符時,在本行其后面不能再有任何字符,空格都不行。所以,只有最后一
              個反斜杠才是接續符。
              但是請注意:有的系統里規定路徑的要用雙反斜杠“\\” ,比如:
              #define ENG_PATH_4 E:\\English\\listen_to_this\\listen_to_this_3

              3、用 define 宏定義注釋符號?

              上面對 define 的使用都很簡單,再看看下面的例子:
              #define BSC //
              #define BMC /*
              #define EMC */
              D),BSC my single-line comment
              E),BMC my multi-line comment EMC
              D)和 E)都錯誤,為什么呢?因為注釋先于預處理指令被處理,當這兩行被展開成//…或
              /*…*/時,注釋已處理完畢,此時再出現//…或/*…*/自然錯誤.因此,試圖用宏開始或結束一段
              注釋是不行的。

              4、用 define 宏定義表達式

              這些都好理解,下面來點有“技術含量”的:
              定義一年有多少秒:
              #define SEC_A_YEAR 60*60*24*365
              這個定義沒錯吧?很遺憾,很有可能錯了,至少不可靠。你有沒有考慮在 16 位系統下
              把這樣一個數賦給整型變量的時候可能會發生溢出?一年有多少秒也不可能是負數吧。修
              改一下:
              #define SEC_A_YEAR (60*60*24*365) UL
              又出現一個問題,這里的括號到底需不需要呢?繼續看一個例子:
              定義一個宏函數,求 x 的平方:
              更多免費資源:www.fishc.com
              #define ?SQR (x) ? x * x
              對不對?試試:假設 x 的值為 10, SQR (x)被替換后變成 10*10。沒有問題。
              再試試:假設 x 的值是個表達式 10+1, SQR (x)被替換后變成 10+1*10+1。問題來了,
              這并不是我想要得到的。怎么辦?括號括起來不就完了?
              #define SQR (x) ((x) *(x))
              最外層的括號最好也別省了,看例子:
              求兩個數的和:
              #define SUM (x) (x) +(x)
              如果 x 的值是個表達式 5*3, 沒有問題。
              而代碼又寫成這樣:SUM (x)* SUM (x)。替換后變成:(5*3)+(5*3) *(5*3) +(5*3)。又錯了!
              所以最外層的括號最好也別省了。我說過 define 是個演技高超的替身演員,但也經常耍大牌。 要搞定它其實很簡單,別吝嗇括號就行了。
              注意這一點:宏函數被調用時是以實參代換形參。而不是“值傳送”。

              5、宏定義中的空格

              另外還有一個問題需要引起注意,看下面例子:
              #define SUM (x) (x) +(x)
              這還是定義的宏函數 SUM(x)嗎?顯然不是。編譯器認為這是定義了一個宏: SUM,
              其代表的是(x) (x) +(x)。為什么會這樣呢?其關鍵問題還是在于 SUM 后面的這個空
              格。所以在定義宏的時候一定要注意什么時候該用空格,什么時候不該用空格。這個空格僅
              僅在定義的時候有效,在使用這個宏函數的時候,空格會被編譯器忽略掉。也就是說,上一
              節定義好的宏函數 SUM(x)在使用的時候在 SUM 和(x)之間留有空格是沒問題的。比
              如: SUM(3)和 SUM (3)的意思是一樣的。
              ?

              *******************************************typedef? VS? #define************************************************

              ********************************************************************************************************************

              #define?是 C 指令,用于為各種數據類型定義別名,與?typedef?類似,但是它們有以下幾點不同:

              • typedef?僅限于為類型定義符號名稱,#define?不僅可以為類型定義別名,也能為數值定義別名,比如您可以定義 1 為 ONE。
              • typedef?是由編譯器執行解釋的,#define?語句是由預編譯器進行處理的。

              #define?是 C 指令,用于為各種數據類型定義別名,與?typedef?類似,但是它們有以下幾點不同:

              總結

              以上是生活随笔為你收集整理的typedef VS #define —— C语言中的 关键字 与 C指令的全部內容,希望文章能夠幫你解決所遇到的問題。

              如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。