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指令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对C语言 结构指针变量做函数的参数 结构
- 下一篇: 对C语言 static作用——修饰 变