日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/10/17 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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、數值宏常量

因為編譯器會在預編譯的時候用真身替換替身,而
在我們的代碼里面卻又用常常用替身來幫忙。看例子:
#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指令的全部內容,希望文章能夠幫你解決所遇到的問題。

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