意思是用 IS_GPIO_ALL_PERIPH(PERIPH) 代替 (((PERIPH) == GPIOA) || ((PERIPH) == GPIOB) ||((PERIPH) == GPIOC) || ((PERIPH) == GPIOD) || ((PERIPH) == GPIOE) || ((PERIPH) == GPIOF) || ((PERIPH) == GPIOG)) 到程序中去。 而#define 后的內(nèi)容要求只能寫在同一行上,如果內(nèi)容過多寫不開,可以用 \空格 來連接下一行的內(nèi)容。這種寫法只是編程習慣,使程序看上去清晰明了。 #define 的作用 在C或C++語言源程序中允許用一個標識符來表示一個字符串,稱為“宏”。被定義為“宏”的標識符稱為“宏名”。在編譯預處理時,對程序中所有出現(xiàn)的“宏名”,都用宏定義中的字符串去代換,這稱為“宏代換”或“宏展開”。宏定義是由源程序中的宏定義命令完成的。宏代換是由預處理程序自動完成的。 在C或C++語言中,“宏”分為有參數(shù)和無參數(shù)兩種。 宏定義的優(yōu)點 (1) 方便程序的修改 使用簡單宏定義可用宏代替一個在程序中經(jīng)常使用的常量,這樣在將該常量改變時,不用對整個程序進行修改,只修改宏定義的字符串即可,而且當常量比較長時, 我們可以用較短的有意義的標識符來寫程序,這樣更方便一些。我們所說的常量改變不是在程序運行期間改變,而是在編程期間的修改,舉一個大家比較熟悉的例 子,圓周率π是在數(shù)學上常用的一個值,有時我們會用3.14來表示,有時也會用3.1415926等,這要看計算所需要的精度,如果我們編制的一個程序中 要多次使用它,那么需要確定一個數(shù)值,在本次運行中不改變,但也許后來發(fā)現(xiàn)程序所表現(xiàn)的精度有變化,需要改變它的值, 這就需要修改程序中所有的相關(guān)數(shù)值,這會給我們帶來一定的不便,但如果使用宏定義,使用一個標識符來代替,則在修改時只修改宏定義即可,還可以減少輸入 3.1415926這樣長的數(shù)值多次的情況,我們可以如此定義 #define pi 3.1415926,既減少了輸入又便于修改,何樂而不為呢? (2) 提高程序的運行效率 使用帶參數(shù)的宏定義可完成函數(shù)調(diào)用的功能,又能減少系統(tǒng)開 銷,提高運行效率。正如C語言中所講,函數(shù)的使用可以使程序更加模塊化,便于組織,而且可重復利用,但在發(fā)生函數(shù)調(diào)用時,需要保留調(diào)用函數(shù)的現(xiàn)場,以便子 函數(shù)執(zhí)行結(jié)束后能返回繼續(xù)執(zhí)行,同樣在子函數(shù)執(zhí)行完后要恢復調(diào)用函數(shù)的現(xiàn)場,這都需要一定的時間,如果子函數(shù)執(zhí)行的操作比較多,這種轉(zhuǎn)換時間開銷可以忽 略,但如果子函數(shù)完成的功能比較少,甚至于只完成一點操作,如一個乘法語句的操作,則這部分轉(zhuǎn)換開銷就相對較大了,但使用帶參數(shù)的宏定義就不會出現(xiàn)這個問 題,因為它是在預處理階段即進行了宏展開,在執(zhí)行時不需要轉(zhuǎn)換,即在當?shù)貓?zhí)行。宏定義可完成簡單的操作,但復雜的操作還是要由函數(shù)調(diào)用來完成,而且宏定義 所占用的目標代碼空間相對較大。所以在使用時要依據(jù)具體情況來決定是否使用宏定義。 在#define中,標準只定義了#和##兩種操作。#用來把參數(shù)轉(zhuǎn)換成字符串,##則用來連接兩個前后兩個參數(shù),把它們變成一個字符串。 程序舉例 #include <stdio.h> #define paster( n ) printf( "token " #n" = %d\n ", token##n ) void main() { int token9=10; paster(9); } 輸出為 token 9 = 10
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。