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