c语言编译系统对编译预处理命令的处理是,C语言编译预处理

41528d3028836879cd698677c3999917.gifC语言编译预处理

编 译 预 处 理 命 令 1 编译预处理编译预处理 v C语言编译系统的一个组成部分。是指编译前由编译系 统中的预处理程序对源程序的预处理命令进行加工。C 程序的源代码中的编译预处理命令不是C语言的一部分 更不是C语句,但它扩展了C程序设计的环境。 v C语言的预处理命令均以“#”打头,末尾不加分号,以区 别于一般的C语句,其作用域是出现点到源程序文件的 末尾。 v C程序提供的预处理功能有三种: Ø 宏定义(宏替换) Ø 文件包含 Ø 条件编译。 第9章 编译预处理命令 编 译 预 处 理 命 令 2 1. 不带参数的宏定义 用一个指定的标识符来代表一个字符串,它的一般形式 为: #define 标识符 字符串 这种方法使用户能以一个简单的名字代替一个长的字符 串,因此把这个标识符称为宏名宏名,在预编译时将宏名替换成 字符串的过程称为宏展开宏展开。 « 宏定义 #define PI 3.1415926 void main() { float l,s,r,v; printf(“ radius :“); scanf(“%f“, l=2.0*PI*r; s=PI*r*r; v=4.0/3*PI*r*r*r; printf(“l=%10.4f\ns=%10.4f\nv=%10.4f\n“, l,s,v); } 编 译 预 处 理 命 令 3 说明: 1.宏名一般习惯用大写字母表示,以与变量名区别。 2.使用宏名代替一个字符串,可以减少程序中重复书写 某些字符串的工作量,还可提高程序的可移植性。 3.宏定义是用宏名代替一个字符串,也就是作简单的置 换,不作语法检查。 4.宏定义不是C语句,不要在行末加分号。 5.#define命令中的宏名的有效范围为定义命令之后 到本源文件结束。 6.可以用#undef命令终止宏定义的作用域。 #undef 宏名 7.在进行宏定义时,可以引用已定义的宏名,可以层 层置换。 8.对程序中用双引号括起来的字符串内的字符不进行 置换。 #define R 3.0 #define PI 3.1415926 #define L 2*PI*R #define S PI*R*R #include void main() { printf(“L=%f\nS=%f\n“,L,S); } printf(“L=%f\nS=%f\n“, 2*3.1415926*3.0,3.1415926*3.0*3.0); 编 译 预 处 理 命 令 4 不是进行简单的字符串替换,还要进行参数替换。 v其定义的一般形式为: #define 宏名(参数表) 字符串 例如:#define S(a,b) a*b #define PR(x) printf("s=%f\n”, x) 2. 带参数的宏定义 v带实参的宏名被展开时,宏名被所定义的宏体替换, 宏体中的形参按从左到右的顺序被实参替换。 area=S(3,2)展开的结果是: area=3*2; S(a+c, b+c)展开的结果是: a+c*b+c; PR(area)展开的结果是: printf("s=%f\n”, area) v在宏定义时,在宏名与带参数的括弧之间不应加空格, 否则将空格以后的字符都作为替代字符串的一部分。 编 译 预 处 理 命 令 5 带参数的宏与函数有什么不同? 1.使用带参的宏实参对形参只是进行简单的字符串替换。 2. 宏在展开时并不分配内存单元,不进行值的传递处理,也 没有返回值的概念。 3. 宏不存在类型问题,宏名无类型,它的参数也无类型,只 是一个符号代表而已。 4.宏替换不占运行时间,只占编译时间。而函数调用则占运 行时间。 编 译 预 处 理 命 令 6 1. 文件包含是指一个源文件可以将另一个源文件的全部 内容包含进来。 2.#include命令有两种格式。 #include #include “文件名“ 3.两种格式区别 编译系统寻找文件的方式不同,尖括号表示直接到包含 目录(include)查找,常用于嵌入系统提供的标准文件; 双引号首先在当前文件目录查找,常用于包含用户自己 编写的文件 4.程序设计中,常常把公用符号常量或者宏定义组成一 个文件,减少重复书写。 « 文件包含 编 译 预 处 理 命 令 7 文件 at.h #define PR printf #define NL “\n“ #define D “%d“ #define D1 D NL #define D2 D D NL #define D3 D D D NL #define D4 D D D D NL 文件 print.c #include “at.h “ void main() {int a,b,c,d; a=1;b=2;c=3;d=4; PR (D1,a); PR (D2,a,b); PR (D3,a,b,c); PR (D4,a,b,c,d); } 例:用宏代表输出格式 编 译 预 处 理 命 令 8 它的功能是:当标识符已经被定义过,则对程序段1进行编 译,否则编译程序段2,其中#else部分可以没有。 « 条件编译 一般情况下,源程序的所有行都参加编译,但有时希 望对其中一部分内容只在满足一定条件时才进行编译, 也就是对一部分内容指定编译的条件,这就是条件编 译。条件编译有以下3种形式: 1.#ifdef 标识符 程序段1 #else 程序段2 #endif #ifdef 标识符 程序段1 #endif 编 译 预 处 理 命 令 9 它的作用是:当指定的 表达式值为真(非0) 时就编译程序段1,否则 编译程序段2。 2.#ifndef 标识符 程序段1 #else 程序段2 #endif 第一行与第一种形式不同: 将ifdef改为ifndef。 它的作用是:若标识符未被 定义,则编译程序段1,否 则编译程序段2。 3.#if 表达式 程序段1 #else 程序段2 #endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值