了解c預處理的一些操作,對c的嵌入式開發的設計,除錯,應用都會有很大的幫助,因此這裡對c預處理器的一些操作做了乙個簡單的總結,一是對我接下來的嵌入式設計有乙個思路的整理,另一方面也希望對偶然逛到本文的你有幫助。
想要深入的了解,必須解決幾個問題。
1 . c預處理器負責哪些事情?
1)將符號縮寫替換成其表示的內容(ex:#define);
2)包含程式所需的其他檔案(ex:#include);
3)選擇讓編譯器檢視或者執行哪些**(#if #else #endif);
2 . 編譯器進入預處理之前還會做什麼操作?
1)把原始碼出現的字元對映到源字符集;
這個階段主要是對程式做字元和字符集的對映操作;
值得注意的是,c語言是基於美鍵盤而來的,但是有些鍵盤沒有所有c的符號,這個時候怎麼辦?c提供了三字串行和雙字串行解決這些問題,因此看到這些**時,不要覺得奇怪。
例如:
// 三字串行
??=include // 翻譯過來就是
#include
再例如:
// 雙字串行
%:include //與三字元不同的是,不會替換" "中的雙字串行;
// 翻譯過來就是
#include
2) 編譯器定位每個反斜槓後面跟著換行符的例項,並刪除他們。 將物理行(physical line)轉換成邏輯行(logic line);
#include int main()
執行結果為:
physical line : my name is mashuai
logical line : my name is mashuai
3) 編譯器將注釋用乙個空格字元代替。最後,程式開始準備好進入預處理階段,預處理將查詢一行中以#開始的預處理指令。
3 . 程式預處理是做什麼事情?
1)明示常量 #define: 包括一些物件巨集和函式巨集。 下面列舉了乙個典型的嵌入式工程巨集定義;
值得注意的是,編譯器在編譯期對所有的常量表示式(只包含常量)求值,所以預處理器不會進行實際的乘除運算。預處理不做計算,不對表示式求值,只是進行簡單的替換。
#define u8 unsigned char // 做一些資料結構的定義
#define u16 unsigned short
#define u32 unsigned int
/*巨集定義*/
#define filteradtimes 4 // 定義程式執行過程中用到的固定值,便於修正和除錯
#define resadtimes 8
#define bodyadtimes 20
#define resstablecount 150
#define bodystablecount 350
#define default_kbcount 1100
#define res_min 3000 //200ohm
#define ref_res 7000 //700ohm
#define res_max 10000 //1500ohm
//#define short_fwr_50khz 00110011b // 定義暫存器配置模式,用巨集定義更方便閱讀和除錯;
//#define ref0_fwr_50khz 00010011b
//#define ref1_fwr_50khz 00100011b
//#define body_fwr_50khz 00000011b
#define short_fwr_50khz 0x33 //內短模式
#define ref0_fwr_50khz 0x13 //參考電阻0模式
#define ref1_fwr_50khz 0x23 //參考電阻1模式
#define body_fwr_50khz 0x03 //人體模式
/*暫存器位址定義*/
#define addr_afe_sys 0 // 定義暫存器名,便於程式的閱讀和除錯;
#define addr_afe_adc0 1
#define addr_afe_adc1 2
#define addr_afe_adc2 3
#define addr_afe_adc3 4
#define addr_afe_adc4 5
#define addr_afe_adc5 6
#define addr_afe_bim0 7
#define addr_afe_bim1 8
#define addr_afe_ado 9
#define addr_afe_ads 10
#define addr_afe_config 0x10
#define addr_afe_vreft 0x11
#define addr_afe_ldot 0x12
#define addr_afe_osct 0x13
#define addr_afe_tst1 0x14
#define addr_afe_tst2 0x15
#define addr_afe_tmux 0x16
#define addr_afe_otpcon 0x59
#define addr_afe_test 0x5a
#define tolerance0 5 // 定義有固定值通過固定關係衍生出的值,以便於修改和程式除錯;
#define z12_l0 6000-(6000 * tolerance0 / 100)
#define z12_h0 6000+(6000 * tolerance0 / 100)
#define z13_l0 5680-(5680 * tolerance0 / 100)
#define z13_h0 5680+(5680 * tolerance0 / 100)
#define z14_l0 5680-(5680 * tolerance0 / 100)
#define z14_h0 5680+(5680 * tolerance0 / 100)
#define z23_l0 5680-(5680 * tolerance0 / 100)
#define z23_h0 5680+(5680 * tolerance0 / 100)
#define z24_l0 5680-(5680 * tolerance0 / 100)
#define z24_h0 5680+(5680 * tolerance0 / 100)
#endif
2)函式巨集:
#include #define square(x) x*x
#define pr(x) printf("the result is %d.\n",x) //函式巨集
int main(void)
// 注意點:這裡需要注意的是 函式巨集替換時不會替換 "" 內的內容;如果想要替換,就」#ex_para「替換;
C 預處理器
偶爾翻c 的教材,看到了一些以前自己不太關注的角落。參考教材 c 大學教程 harvey m.deitel 和paul james deitel著。預處理發生在編譯之前,包括把其他檔案包含到要編譯的檔案中 定義符號常量和巨集 程式 的條件編譯以及預處理指令的條件執行。對應的,預處理指令有 檔案包含命...
C 預處理器
預處理器是一些指令,指示編譯器在實際編譯之前所需完成的預處理。所有的預處理器指令都是以井號 開頭,只有空格字元可以出現在預處理指令之前。預處理指令不是 c 語句,所以它們不會以分號 結尾。我們已經看到,之前所有的例項中都有 include指令。這個巨集用於把頭檔案包含到原始檔中。c 還支援很多預處理...
C 預處理器
預處理器是一些指令,指示編譯器在實際編譯之前所需完成的預處理。所有的預處理器指令都是以井號 開頭,只有空格字元可以出現在預處理指令之前。預處理指令不是 c 語句,所以它們不會以分號 結尾。我們已經看到,之前所有的例項中都有 include指令。這個巨集用於把頭檔案包含到原始檔中。c 還支援很多預處理...