C在程式執行之前,C預處理器會進行哪些操作?

2021-09-02 15:36:48 字數 3914 閱讀 9789

了解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 還支援很多預處理...