请选择 进入手机版 | 继续访问电脑版
贠老师培训群:150322713    贠老师QQ:767708506

贠老师office培训-excel学习网

 找回密码
 立即注册
点击咨询贠老师
查看: 293|回复: 7

[C语言] C语言条件编译详解

[复制链接]

3172

主题

3269

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
22860
发表于 2015-12-24 18:11:43 | 显示全部楼层 |阅读模式
预处理程序提供了条件编译的功能,可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。条件编译有三种形式,下面分别介绍。
第一种形式第一种形式的格式为:
#ifdef  标识符
    程序段1
#else
    程序段2
#endif

它的功能是,如果标识符已被 #define 命令定义过则对程序段1进行编译;否则对程序段2进行编译。如果没有程序段2(它为空),本格式中的#else可以没有,即可以写为:
#ifdef  标识符
    程序段
#endif

请看下面的例子:
  • #include <stdio.h>
  • #define WIN16 true
  • int main(void){
  •     #ifdef WIN16
  •         printf("The value of sizeof(int) is 2.\n");
  •     #else
  •         printf("The value of sizeof(int) is 4.\n");
  •     #endif
  •     return 0;
  • }


运行结果:
The value of sizeof(int) is 2.

第4行插入了条件编译预处理命令,要根据 WIN16 是否被定义过来决定编译哪一个 printf 语句。而在程序的第2行已对 WIN16 作过宏定义,所以应对第一个 printf 语句进行编译。

程序第2行宏定义中,定义 WIN16 表示字符串 true,其实也可以为任何字符串,甚至不给出任何字符串,写为:#define WIN16也具有同样的意义。只有取消程序的第2行才会去编译第二个 printf 语句。
第二种形式第二种形式的格式为:
#ifndef 标识符
    程序段1
#else
    程序段2
#endif

与第一种形式的区别是将ifdef改为ifndef。它的功能是,如果标识符未被#define命令定义过则对程序段1进行编译,否则对程序段2进行编译。这与第一种形式的功能正相反。
第三种形式第三种形式的格式为:
#if 常量表达式
    程序段1
#else
    程序段2
#endif

它的功能是,如常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2进行编译。因此可以使程序在不同条件下,完成不同的功能。

请看下面的例子:
  • #include <stdio.h>
  • #define R 1
  • int main(){
  •     float len, area_round, area_square;
  •     printf ("input a number: ");
  •     scanf("%f", &len);
  •     #if R
  •         area_round = 3.14159*len*len;
  •         printf("Area of round is: %f\n", area_round);
  •     #else
  •         area_square = len*len;
  •         printf("Area of square is: %f\n", area_square);
  •     #endif
  •     return 0;
  • }


运行结果:
input a number: 4
Area of round is: 50.265442

第2行宏定义中,定义R为1,因此在条件编译时,常量表达式的值为真,所以计算并输出圆面积。

上面介绍的条件编译当然也可以用条件语句 if-else 来实现。 但是用条件语句将会对整个源程序进行编译,生成的目标代码程序较长,而采用条件编译,则根据条件只编译其中的程序段1或程序段2,生成的目标程序较短。如果条件选择的程序段很长,采用条件编译的方法是十分必要的。
回复

使用道具 举报

1

主题

1045

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2016-8-29 11:56:00 | 显示全部楼层
顶顶
回复 支持 反对

使用道具 举报

1

主题

1045

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2016-12-26 13:57:37 | 显示全部楼层
不错,学习了
回复 支持 反对

使用道具 举报

0

主题

731

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2017-1-28 14:47:01 | 显示全部楼层
顶楼主,帮你顶个贴,我挣个积分
回复 支持 反对

使用道具 举报

1

主题

1066

帖子

76

积分

注册会员

Rank: 2

积分
76
发表于 2017-4-25 19:46:46 | 显示全部楼层
我是路过的,轻轻飘过
回复 支持 反对

使用道具 举报

0

主题

918

帖子

45

积分

注册会员

Rank: 2

积分
45
发表于 2017-10-5 19:17:37 | 显示全部楼层
能再解释的细节一些吗,具体的
回复 支持 反对

使用道具 举报

0

主题

914

帖子

61

积分

注册会员

Rank: 2

积分
61
发表于 2018-6-17 22:11:07 | 显示全部楼层
先收藏再学习,谢谢啦!
回复 支持 反对

使用道具 举报

2

主题

964

帖子

108

积分

注册会员

Rank: 2

积分
108
发表于 2018-12-3 18:03:42 | 显示全部楼层
佩服你,能发这么好的帖子,厉害
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



陕ICP备15003731号  

贠老师培训 GMT+8, 2018-12-15 00:03 , Processed in 0.243475 second(s), 33 queries .

快速回复 返回顶部 返回列表