预编译就是在对源文件进行处理之前(如在语法扫描和分析之前),先处理预处理部分,精简代码,然后再进行编译。
预处理命令有:#include 文件包含、#define 宏定义、以及要重点讲的#if、#ifdef、#else、#endif、#ifndef 条件编译。这里讲的是条件编译。
条件编译,分下面三种情况:
一、
#ifdef_XXXX
程序段1
#else
程序段2
#endif
表示的是,如果XXXX被宏定义过,即 if (#define XXXX),则执行程序段1,否则执行程序段2,执行后结束条件编译。
实例如下:
#define NUM
.............
.............
.............
#ifdef NUM
printf("之前NUM有过定义啦!:) \n"); //执行这一步而不执行else程序块
#else
printf("之前NUM没有过定义!:( \n");
#endif
利用这种办法,将很容易开关程序中的某项功能。
二、
#ifndef_XXXX
程序块1
#else
程序块2
#endif
表示的是,如果没有宏定义XXXX过(if not define XXXX),则执行程序块1,否则执行程序块2,最后结束条件预处理。
三、
#if 常量
...程序段1...
#else
...程序段2...
#endif
这里表示,只要常量非零(不管是正是负),就执行程序块1,否则执行程序块2
主要的用法有(来自CSDN的lijinyan3000整理):
” 我们主要使用以下几种方法,假设我们已在程序首部定义#ifdef DEBUG与#ifdef TEST:
1.利用#ifdef/#endif将某程序功能模块包括进去,以向某用户提供该功能。
在程序首部定义#ifdef HNLD:
#ifdef HNLD
#include"n166_hn.c"
#endif
如果不许向别的用户提供该功能,则在编译之前将首部的HNLD加一下划线即可。
2.在每一个子程序前加上标记,以便追踪程序的运行。
#ifdef DEBUG
printf(" Now is in hunan !");
#endif
3.避开硬件的限制。有时一些具体应用环境的硬件不一样,但限于条件,本地缺乏这种设备,于是绕过硬件,直接写出预期结果。具体做法是:
#ifndef TEST
i=dial();
//程序调试运行时绕过此语句
#else
i=0;
#endif
调试通过后,再屏蔽TEST的定义并重新编译,即可发给用户使用了。 “