应用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中。“文件包含”命令可以节省程序设计人员的重复劳动,比如在某个头文件中定义了一些共用的宏定义、全局变量、结构体、函数等等,这样其他文件都可以通过“文件包含”命令来把这个文件包含进来,这样就可以使用此文件中的定义了。