预处理命令
重点:
午餐宏定义和有参宏定义;
文件包含;
条件编译。
一、宏定义
C语言标准允许在程序中用一个标识符来表示字符串,称为宏。标识符为宏名,在编译预处理时,将程序中所有的宏名用相应的字符串来替换,这个过程称为宏替换,宏分为两种:无参数宏和有参数宏。1.无参数宏
无参数宏定义一般形式:
#define 标识符字符串
“#”代表本行是编译预处理命令。define是宏定义的关键词,标识符是宏名。字符串是宏名所代替的内容,可以是常数、表达式等。
例:使用无参数宏的程序,输入半径,求圆的周长、面积和体积。
#include "stdafx.h"
#define PI 3.1415926
int _tmain(int argc, _TCHAR* argv[])
{
float l,s,r,v;
printf("input radius:");
scanf("%f",&r);
l=2.0*PI*r;
s=PI*r*r;
v=4.0/3.0*PI*r*r*r;
printf("l=%10.4f\n s=%10.4f\n v=%10.4f\n",l,s,v);
getchar();
return 0;
}

说明:使用宏代替一个字符串,可以减少程序中重复书写某些字符串的工作量。如果没有使用宏,那么就要查找程序并修改所有的PI值。宏的作用范围是从宏定义开始到源程序文件结束为止。
2.有参数宏
有参数的宏类似于有参数的函数,其定义的一般形式:
#define 标识符(形参表)字符串
如果有多个形参,像函数参数一样以逗号隔开。在程序中使用有参数宏的形式是:
标识符(实参表)
例:演示有参宏的实现方法
#include "stdafx.h"
#define MAX(x,y) (x>y?x:y)
int _tmain(int argc, _TCHAR* argv[])
{
int a=1,b=2,max;
max=MAX(a,b);
printf("the max between(%d,%d)is%d\n",a,b,max);
getchar();
return 0;
}

注意:宏名与形参表的圆括号之间不能有空格,否则会导致错误。在宏定义中,字符串内的形式参数最好用括号括起来,以避免错误。
总的来说,当语句较简单时,可考虑使用宏定义,从程序执行的速度来说,它优于函数。使用宏的次数较多时,宏替换后源程序一般会变长。而函数调用不会使程序变长。宏替换不会占用运行时间,只是编译的时间稍微长一点。而函数调用则会占用运行时间。一般用宏定义代表一些较为简单的表达式比较适合。
二、文件包含
文件包含是指把指定源文件的全部内容包括到当前源程序文件中。
一般形式:#include “文件名”
文件包含预定处理命令#include的作用是使一个源文件可以将另一个源文件的全部内容包含进来,把指定的文件插入命令行位置取代命令行,从而把指定文件和当前的源程序文件连成一个源程序。
三、条件编译
条件编译是指在特定的条件下,对满足条件和不满足条件的情况分别进行处理——满足条件时编译某些语句,不满足条件时编译一些语句。
条件编译命令有几种模式:
模式一:
#ifndef 标识符
程序段1
#endif
其含义是:如果没有定义标识符,则编译程序段1(既可以是语句组,也可以命令行)。
实例:
#ifndef getkey
#define getkey
#include <sys/types.h>
#endif
模式二:
#ifndef 标识符
程序段1
#else
程序段2
#endif
其含义是:如果没有定义标识符,就编译程序段1,否则就编译程序段2。
模式三:
#ifdef 标识符
程序段1
#endif
其含义:如果定义了标识符,就编译程序段1,否则就不编译该程序段。
实例:
#ifdef DEBUG
printf{"a=%d,b=%d",a,b};
#endif
模式四:
#ifdef 标识符
程序段1
#else
程序段2
#endif
其含义是:如果定义了标识符,就编译程序段1,否则编译程序段2。
模式五:
#if 表达式
程序段1
#endif
其含义是:如果表达式成立,则就编译程序段1,否则不编译该程序段。
实例:
#include<stdio.h>
#define MAX(x,y) (x>y?x:y)
...
int a=5,b=10,c;
...
#if c
c=MAX(a,b);
#endif
模式六:
#if 表达式
程序段1
#else
程序段2
#endif
其含义是:如果表达式成立,就编译程序段1,否则编译程序段2。