c中的预编译宏定义

c中的预编译宏定义

ID:8810631

大小:46.50 KB

页数:10页

时间:2018-04-08

c中的预编译宏定义_第1页
c中的预编译宏定义_第2页
c中的预编译宏定义_第3页
c中的预编译宏定义_第4页
c中的预编译宏定义_第5页
资源描述:

《c中的预编译宏定义》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、C中的预编译宏定义.txt38当乌云布满天空时,悲观的人看到的是“黑云压城城欲摧”,乐观的人看到的是“甲光向日金鳞开”。无论处在什么厄运中,只要保持乐观的心态,总能找到这样奇特的草莓。在将一个C源程序转换为可执行程序的过程中,编译预处理是最初的步骤.这一步骤是由预处理器(preprocessor)来完成的.在源流程序被编译器处理之前,预处理器首先对源程序中的"宏(macro)"进行处理.C初学者可能对预处理器没什么概念,这是情有可原的:一般的C编译器都将预处理,汇编,编译,连接过程集成到一起了.编译预处理往往在后台运行.在有的C编译器中,这些过程统统由一个单独的程序来完成,编译的不同

2、阶段实现这些不同的功能.可以指定相应的命令选项来执行这些功能.有的C编译器使用分别的程序来完成这些步骤.可单独调用这些程序来完成.在gcc中,进行编译预处理的程序被称为CPP,它的可执行文件名为cpp.编译预处理命令的语法与C语言的语法是完全独立的.比如:你可以将一个宏扩展为与C语法格格不入的内容,但该内容与后面的语句结合在一个若能生成合法的C语句,也是可以正确编译的.(一)预处理命令简介注意:函数宏对参数类型是不敏感的,你不必考虑将何种数据类型传递给宏.那么,如何构建对参数类型敏感的宏呢?参考本章的第九部分,关于"##"的介绍.关于定义宏的另外一些问题(1)宏可以被多次定义,前提是

3、这些定义必须是相同的.这里的"相同"要求先后定义中空白符出现的位置相同,但具体的空白符类型或数量可不同,比如原先的空格可替换为多个其他类型的空白符:可为tab,注释...e.g.#defineNULL0#defineNULL /*nullpointer*/0上面的重定义是相同的,但下面的重定义不同:#definefun(x)x+1#definefun(x)x+1或:#definefun(y)y+1如果多次定义时,再次定义的宏内容是不同的,gcc会给出"NAMEredefined"警告信息.应该避免重新定义函数宏,不管是在预处理命令中还是C语句中,最好对某个对象只有单一的定义.在gcc

4、中,若宏出现了重定义,gcc会给出警告.(2)在gcc中,可在命令行中指定对象宏的定义:e.g.$gcc-Wall-DMAX=100-otmptmp.c相当于在tmp.c中添加"#defineMAX100".那么,如果原先tmp.c中含有MAX宏的定义,那么再在gcc调用命令中使用-DMAX,会出现什么情况呢?---若-DMAX=1,则正确编译.---若-DMAX的值被指定为不为1的值,那么gcc会给出MAX宏被重定义的警告,MAX的值仍为1.注意:若在调用gcc的命令行中不显示地给出对象宏的值,那么gcc赋予该宏默认值(1),如:-DVAL==-DVAL=1(3)#define所定

5、义的宏的作用域宏在定义之后才生效,若宏定义被#undef取消,则#undef之后该宏无效.并且字符串中的宏不会被识别e.g.#defineONE1sum=ONE+TWO/*sum=1+TWO*/#defineTWO2sum=ONE+TWO/*sum=1+2*/#undefONEsum=ONE+TWO/*sum=ONE+2*/charc[]="TWO"/*c[]="TWO",NOT"2"!*/(4)宏的替换可以是递归的,所以可以嵌套定义宏.e.g.#defineONENUMBER_1#defineNUMBER_11inta=ONE/*a=1*/2,#undef#undef用来取消宏定义

6、,它与#define对立:#undefname如够被取消的宏实际上没有被#define所定义,针对它的#undef并不会产生错误.当一个宏定义被取消后,可以再度定义它.3,#if,#elif,#else,#endif#if,#elif,#else,#endif用于条件编译:#if常量表达式1语句...#elif常量表达式2语句...#elif常量表达式3语句......#else语句...#endif#if和#else分别相当于C语句中的if,else.它们根据常量表达式的值来判别是否执行后面的语句.#elif相当于C中的else-if.使用这些条件编译命令可以方便地实现对源代码内容

7、的控制.else之后不带常量表达式,但若包含了常量表达式,gcc只是给出警告信息.使用它们可以提升代码的可移植性---针对不同的平台使用执行不同的语句.也经常用于大段代码注释.e.g.#if0{一大段代码;}#endif常量表达式可以是包含宏,算术运算,逻辑运算等等的合法C常量表达式,如果常量表达式为一个未定义的宏,那么它的值被视为0.#ifMACRO_NON_DEFINED==#if0在判断某个宏是否被定义时,应当避免使用#if,因为该宏的值可能就是被定

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。