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

原文地址:https://www.cnblogs.com/LoongEmbedded/p/5298758.html