应用C预处理命令
********************************LoongEmbedded********************************
作者:LoongEmbedded(kandi)
時(shí)間:2011.10.17
類別:C基礎(chǔ)
********************************LoongEmbedded********************************
很多C編譯系統(tǒng)都包含預(yù)處理、編譯和連接等部分,其中C提供的預(yù)處理功能主要有下面三種:
1)????? 宏定義
2)????? 文件包含
3)????? 條件編譯
?
下面是我在開(kāi)發(fā)WINCE6.0+S3C6410的背光驅(qū)動(dòng)的時(shí)候,因?yàn)榭紤]要兼容開(kāi)發(fā)板和實(shí)際項(xiàng)目A,利用C預(yù)處理功能來(lái)處理時(shí)遇到的問(wèn)題的描述和總結(jié),利用C預(yù)處理功能所添加的應(yīng)用如下:
1)????? 在bsp_cfg.h中添加下面的宏定義
#define PROJECT_A
2)????? 在backlight_pdd.cpp下的BL_InitPWM()加入下面的條件編譯內(nèi)容
#ifdef PROJECT_A
…………………………
RETAILMSG(1, (TEXT("BL_InitPWM() define A\r\n")));
#else
………………………..
RETAILMSG(1, (TEXT("BL_InitPWM() no define A\r\n")));
#endif
上面條件編譯的作用是若所指定的標(biāo)識(shí)符PROJECT_A已經(jīng)被#define命令定義過(guò)(當(dāng)然了,如果在其他目錄下的文件定義,要使用,就必須用文件包含的方式包含進(jìn)來(lái)。),則在程序編譯階段編譯RETAILMSG(1, (TEXT("BL_InitPWM() define A\r\n")));所在的程序段;否則編譯RETAILMSG(1, (TEXT("BL_InitPWM() no define A\r\n")));所在的程序段。
?
3)????? 編譯整個(gè)BSP后生成新的NK更新之后,始終輸出BL_InitPWM() no define A,因?yàn)樵赽sp_cfg.h中定義了PROJECT_A,那么應(yīng)該輸出BL_InitPWM() define A才對(duì)啊。
?
當(dāng)時(shí)項(xiàng)目進(jìn)度很緊,一時(shí)找不出問(wèn)題在哪里,所以換了另外一種的處理方式,現(xiàn)在趁相對(duì)有空的時(shí)候來(lái)查找一個(gè)問(wèn)題的原因,經(jīng)過(guò)仔細(xì)檢查,是因?yàn)闆](méi)有在backlight_pdd.cpp下沒(méi)有把定義了宏P(guān)ROJECT_A的文件包含進(jìn)來(lái)。當(dāng)時(shí)因?yàn)樵趯?duì)背光驅(qū)動(dòng)編譯的時(shí)候沒(méi)有出現(xiàn)編譯出錯(cuò),所以就沒(méi)有注意到這個(gè)問(wèn)題,這是我對(duì)預(yù)處理命令和C語(yǔ)句的理解不太清晰所致,這里強(qiáng)調(diào)一點(diǎn)就是:預(yù)處理命令不是C語(yǔ)言的一部分,C預(yù)處理命令(主要包括宏定義命令、文件包含命令和條件編譯命令)是在預(yù)處理階段處理的,而C語(yǔ)句是在編譯階段處理的。
?
在backlight_pdd.cpp下沒(méi)有添加下面文件包含命令
#include "bsp_cfg.h"
的情況下,在預(yù)處理階段,第2)點(diǎn)的條件編譯處就被認(rèn)為是沒(méi)有定義了宏P(guān)ROJECT_A,自然而然地在程序編譯階段編譯RETAILMSG(1, (TEXT("BL_InitPWM() no define A\r\n")));所在的程序段。解決的辦法就是在backlight_pdd.cpp下添加文件包含命令#include "bsp_cfg.h"。
?
“文件包含”處理是指一個(gè)源文件可以將另外一個(gè)源文件的全部?jī)?nèi)容包含進(jìn)來(lái),即將另外的文件包含到本文件之中,這里就是把文件bsp_cfg.h的內(nèi)容包含到文件backlight_pdd.cpp中?!拔募泵羁梢怨?jié)省程序設(shè)計(jì)人員的重復(fù)勞動(dòng),比如在某個(gè)頭文件中定義了一些共用的宏定義、全局變量、結(jié)構(gòu)體、函數(shù)等等,這樣其他文件都可以通過(guò)“文件包含”命令來(lái)把這個(gè)文件包含進(jìn)來(lái),這樣就可以使用此文件中的定義了。
?
總結(jié)
- 上一篇: WINCE6.0更换桌面壁纸和图标
- 下一篇: TS2003基于触摸屏的应用