在默认情况下,源程序中的所有行都要被编译。但是我们常常希望某些语句行在某些条件满足的情况下才进行编译,这就是条件编译。按不同的条件编译不同的程序部分时,可产生不同的目标代码文件。条件编译有助于程序的移植和调试。条件编译命令有以下几种形式:
1.第一种形式
#ifdef标识符
程序段1
#else
程序段2
#endif
功能:如果标识符已经被定义过(用#define命令),则对程序段1进行编译,否则对程序段2进行编译。如果没有程序段2(即为空),本格式中的#else可以省略,即可以写为:
#ifdef 标识符
程序段
#endif
需要注意:
(1)在上面的两种格式中,都要判断一个条件:标识符是否用#define定义过。
(2)在上面的格式中,“程序段”可以是多条语句,可以是命令行,也可以是预编译命令。
【例11.4】分析程序并写出运行结果。
程序内容如下:
1 #include<stdio.h>
2 #define R 10.0
3 int main()
4 {
5 float r,s;
6 #ifdef R
7 s=3.14159*R*R;
8 printf("area of round is:%f\n",s);
9 #else
10 r=R*R;
11 printf("area of square is:%f\n",r);
12 #endif
13 return 0;
14 }
程序结果如图11.6所示:
图11.6 例11.4程序结果图
【例题中关键问题说明】
(1)本例采用了第一种形式的条件编译。
(2)在程序第一行宏定义中,定义R为10.0,因此在条件编译时,因为标识符R已经被定义过,所以计算并输出圆面积。如果程序开头没有“#define R 10.0”,对程序作适当的修改后,则可计算并输出正方形的面积。
2.第二种形式
#ifndef标识符
程序段1
#else(www.xing528.com)
程序段2
#endif
功能:如果标识符没有被定义,则编译程序段1,否则编译程序段2。
需要注意:这种方式和第一种形式是有区别的,将“ifdef”改为“ifndef”,功能正好相反。
3.第三种形式
#if表达式
程序段1
#else
程序段2
#endif
功能:如果指定的表达式的值为真(非0为真,0为假),则编译程序段1,否则编译程序段2。
需要注意:这个表达式不是运行时的表达式,必须是在编译时就能知道它的值。
【例11.5】利用条件编译,实现两个数求最大值和最小值的程序。
程序内容如下:
1 #include<stdio.h>
2 #define MAX
3 void main()
4 {
5 int a,b;
6 printf(“please input two integer a,b:”);
7 scanf(“%d%d”,&a,&b);
8 #ifdef MAX
9 printf(“The max is%d\n”,a>=b?a:b);
10 #else
11 printf(“The min is%d\n”,a>=b?a:b);
12 #endif
13 }
程序结果如图11.7所示:
图11.7 例11.5程序结果图
【例题中关键问题说明】
(1)显然,当程序通过宏定义定义标识符MAX后,程序编译的代码是:
printf(“The max is%d/n”,a>=b?a:b);
(2)没有宏定义标识符MAX,程序编译的代码是:
printf(“The min is%d/n”,a>=b?a:b);
(3)通过条件编译可以选择不同的代码,从而提高编程的灵活性。
(4)条件编译当然也可以用条件语句来实现。但是用条件语句将会对整个源程序进行编译,生成的目标代码程序很长,而采用条件编译,则根据条件只编译其中的程序段1或程序段2,生成的目标程序较短。如果条件选择的程序段很长采用条件编译的方法是十分必要的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。