51單片機總結--C語言之預處理
編譯預處理器是C語言編譯器的一個重要組成部分。很好的利用C語言的預處理命令可以增強代碼的可讀性,靈活性,和易于修改等特點,便于程序的結構化。
本文引用地址:http://m.butianyuan.cn/article/201608/295292.htm預處理命令由符號“#”開頭,包括宏定義,文件包含,條件處理三個部分。
其中條件編譯我還沒有用過,所以就詳細介紹一下宏定義和文件包含。
一.宏定義
宏定義命令為#define,它的作用就是實現(xiàn)用一個簡單易讀的字符串來代替
另一個字符串。增加程序的可讀性,和維護性。
宏定義分為不帶參數(shù)的宏定義,和帶參數(shù)的宏定義。
不帶參的宏定義:
一般格式:#define 標識符 常量表達式
例如用一個字符代替一個常數(shù)
#define PI 3.1415926
當程序中出現(xiàn)3.1415926這個常數(shù)的時候就可以用PI這個字符代替,如果想修改這個常數(shù)只需要修改這個宏定義中的常數(shù),就可以達到修改整個文件中這個常數(shù)的目的。這就是增加維護性的體現(xiàn)。
使用注意:
使用中#define 和標識符之間必須留有空格,標識符和常量表達式之間也必須有空格。
帶參數(shù)的宏定義:
帶參數(shù)的宏定義和不帶參數(shù)的宏定義之間的區(qū)別在于,帶參數(shù)的宏定義不只是進行字符串的替換,而且還要進行參數(shù)的替換。注意是參數(shù)替換。
格式:
#define 宏符號名(參數(shù)表) 表達式
如:
#define MIN(x,y) (((x)<(y))?(x):(y))
1;注意為了安全起見后邊表達式中的參數(shù)使用“()”括起來,防止程序中
使用該宏時由于優(yōu)先級問題引起的錯誤。
如:#define S(r) PI*r*r
如果程序中用到m=S(a+b)
則替換后等同于 m="PI"*a+b*a+b
顯然與我們的目的不同。
2.宏定義命令#define 要求一行內寫完,如果一行內完不成可以用“”表示下一行繼續(xù)。
二.文件包含
頭文件的目的就是在庫函數(shù)與使用該庫函數(shù)的程序之間建立接口。
頭文件的定義格式。
以頭文件led.h為例。
#ifndef __LED_H__
#define __LED_H__
………內容………
#endif
使用尖括號和雙引號的區(qū)別:
使用尖括號的話,編譯時會先在系統(tǒng)include目錄里搜索,如果找不到才會在源代碼所在目錄搜索;使用雙引號則相反,會先在源代碼目錄里搜索。這就意味著,當系統(tǒng)里(如/usr/include/里)有一個叫做at89c51.h的頭文件,而你的源代碼目錄里也有一個你自己寫的at89c51.h頭文件,那么使用尖括號時用的就是系統(tǒng)里的;而使用雙引號的話則會使用你自己寫的那個。
所以建議: 使用系統(tǒng)里提供的頭文件時使用尖括號
使用自己編寫的頭文件時使用雙引號
典型的頭文件內容包括:
1:說明文字。用于注釋該頭文件的主要內容,函數(shù)的作用,函數(shù)的接口等
2; #define 命令命名的宏定義
3:類型定義。包括結構體,共用體,數(shù)組等類型定義
評論