C语言预编译#define(预处理)_第1页
C语言预编译#define(预处理)_第2页
C语言预编译#define(预处理)_第3页
C语言预编译#define(预处理)_第4页
C语言预编译#define(预处理)_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第C语言预编译#define(预处理)目录一、预定义符号二、#define定义标识符三、#define定义宏四、#define替换规则:五、#和##两个符号(少见)六、宏和函数的对比七、#undef

一、预定义符号

预定义符号是系统本身定义的:

FILE进行编译的源文件的位置LINE文件当前的行号DATE文件被编译的日期TIME文件被编译的时间STDC如果编译器遵循ASNSIC,其值为1,否者未定义

二、#define定义标识符

语法:#definenamestuff(用stuff替换name)

#defineMAX100

#defineSTR"hehe"

intmain()

intmax=MAX;

printf("%d\n",max);//输出100

printf("%s\n",STR);//输出hehe

return0;

三、#define定义宏

#define机制包括了一个机制,允许把参数替换到文本中,这种实现通常称为宏或者宏定义宏的申明方式:#definename(parament-list)stuff其中的parament-list是一个由逗号隔开的符号表,他们可能出现在stuff中。注意:参数列表的左括号必须与name紧邻,如果两者之间有任何空白存在,参数列表就会解释为stuff的一部分。

#defineSQUARE(X)X*X

intmain()

intret=SQUARE(5);

printf("%d\n",ret);//输出25

return0;

上面的宏定义代码存在一定的问题:如果我们换一个参数(将5换成5+1)输出的不是36而是11为什呢?

#defineSQUARE(X)X*X

intmain()

intret=SQUARE(5+1);//替换之后就是(5+1*5+1=11)

printf("%d\n",ret);//输出11

return0;

没加括号

因此,用于对数值表达式进行求值的宏定义都应该用这种方式加上括号,避免在使用宏时由于参数中的操作符或临近操作符之间不可预料的相互作用。

正确的代码:

#defineSQUARE(X)(X)*(X))

intmain()

intret=SQUARE(5+1);

printf("%d\n",ret);//输出36

return0;

四、#define替换规则:

一,#defineNAMElisa

程序中有NAME,但内的东西不会被宏替换。二,宏定义前面的那个必须是合法的用户标识符三,宏定义也不是说后面东西随便写,不能把字符串的两个拆开。四:#defineNAMElisa

程序中有上面的宏定义,并且,程序里有句:

NAMELIST这样,不会被替换成lisaLIST五,宏不能出现递归

五、#和##两个符号(少见)

如果我们想要实现一个代码:把参数插入到字符串中用到#

这里参数a,b就插入到了字符串中了

图中的三句代码是等价的:

printf(%d\n,AGE(lisa,24));

printf(%d\n,AGE(lisa##24));

printf(%d\n,AGE(lisa24));

六、宏和函数的对比

函数和宏都能实现求两个数的最大值

//函数

intMax(intx,inty)

return(xyx:y);

#defineMAX(X,Y)((X)(Y)(X):(Y))

intmain()

inta=10;

intb=20;

intmax=Max(a,b);//输出20

printf("%d\n",max);

max=MAX(a,b);

printf("%d\n",max);//输出20

return0;

通过分析上面的代码实现用宏比用函数会更好,有两个原因:

用于调用函数和从函数返回的代码可能比实际执行的这个小型计算工作所需要的时间更多,所以宏比函数在程序的规模和速度方面更胜一筹。函数的参数必须申明为特定的类型。所以函数只能在类型合适的表达时式上使用。反之宏是与类型无关的。

当然宏相比函数也有劣势的地方:

每次使用宏的时候,一份宏定义的代码将替换插入到程序中。除非宏比较短,否者可能大幅度增加程序的长度。宏没法调试宏由于类型无关,也就不够严谨宏可能会带来运算符优先级的问题,导致程序容易出错。

属性#define定义宏函数代码长度每次使用时宏代码都会被插入到程序中除了非常小的宏之外,程序的长度会大幅度增长函数的代码只出现在一个地方,每次使用这个函数时,都调用那个地方的同一份代码执行速度更快存在函数的调用和函数的额外开销,所以速度相对慢一些操作符优先级宏参数的求值是在所有周围表达式的上下文环境里,除非加上括号,否者邻近操作符的优先级可能产生不可预料的结果,所以建议宏在书写的时候多用括号函数参数只在函数调用的时候求值一次,它的结果值传递给函数。表达式的求值结果更容易预测。带有副作用的参数参数可能被替换带宏中的多个位置,所以带有副作用的参数求值可能会产生不可预料的结果函数参数只在传参的时候求值一次,结果更容易控制参数类型宏的参数与类型无关,只要对参数的操作是合法的,它就可以适用于任何参数类型函数的参数与类型有关,如果参数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论