欢迎来到天天文库
浏览记录
ID:37824244
大小:421.78 KB
页数:11页
时间:2019-05-31
《GCC预处理程序学习总结》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、1GCC预处理程序学习总结byJetway_wmnfromhdu_cloud预处理程序的概念来源于c编程语言的一部分。预处理程序读出源代码,对其中内嵌的指示字进行响应,产生源代码的修改版本。在GNU术语中预处理程序叫做CPP,而GNU的可执行程序叫做cpp。1、指示字directive源代码中预处理指令叫做指示字(directive)。它们以‘#’开头,在每行都是第一个非空字符。通常#都在第一列,后面紧跟着指示关键字。GNU预处理程序能够理解的指示字如下:#define定义宏名字,预处理程序会把这个宏扩展到使用该名字的位置#elif由#if指示字提供一
2、个用于计算的可选表达式#else如果#if、#ifdef或#ifndef为假,提供一个用于编译的可选代码集合#error产生出错信息,挂起预处理程序#if如果计算算术表达式的结果为非零值,就编译指示字和它匹配的#endif之间的代码#ifdef如果已经定义了指定的宏,就编译指示字和它匹配的#endif之间的代码#ifndef如果没有定义指定的宏,就编译指示字和它匹配的#endif之间的代码#include查找指示字列表,直到找到指定的文件,然后将文件内容插入,就好像在文本编辑器中插入一样#include_next和#include一样,但该指示字从查找
3、到的目录之后的目录开始查找#line指出行号以及可能的文件名,报告给编译程序,用于创建目标文件中的调试信息#pragma提供额外信息的标准方法,可用来指出一个编译程序或一个平台。#undef删除前面用#define指示字创建的定义#warning由预处理程序创建的一个警告信息##连续操作符,可用于宏内将两个字符串连接成一个1.1、#define指示字#define指示字定义宏。宏对应一个名字,无论何时在文本中发现这个名字,就用作为宏的值的字符串去替换该名字。一般宏定义效果上为常数,传统上宏名字为大写字符。例如下面一个简单例子:#defineARRAY_
4、SIZE100……intarr[ARRAY_SIZE];GCC学习之预处理程序byJetway2也可以使用表达式来定义宏,如下面的宏用来返回两个值中的较小值。#definemin(a,b)((a)<(b)?(a):(b))下面列举一下宏定义的特征和规则:宏定义包含一行,若为表达清楚或表达式太长时,可将宏写成多行,并用连续符号反斜杠‘’,比如:#defineran(low,high)((int)random()%(high-low+1))+low预处理程序按照顺序处理这些文本,而且只有在定义宏之后才会替换该宏。比如下面例子中,宏B定义之前用一次,定
5、义之后用一次。#defineA100sum=A+B;#defineB100sum=A+B;结果:sum=100+B;sum=100+200;替换是递归式的,因此可以在一个宏中嵌入另一宏。比如下面例子:#defineAB#defineB100r1=B;#defineB200r2=B;结果:r1=100;r2=200;要改变一个宏的定义,有必要删除它,然后再一次定义,比如:#defineA1#undefA#defineA2GCC学习之预处理程序byJetway3对于含有参数的宏来说,在宏名字和括号之间不能有空格。比如:#defineshowint(a)pr
6、intf(‚%d‛,a)#defineincrint(a)a++showint(333);incrint(bbls);下面是预处理结果:printf(‚%d‛,300);(a)a++(bbls);宏的名字在字符串中是不能被替换的,比如:#defineBLOCK100……printf(‚TheBLOCKnumber.‛);输出结果:TheBLOCKnumber.通过处理传递给宏的参数名字,加上‘#’就可将其字符串化。比如:#defineMO(ARG)printf(‚theterm‛#ARG‛isastring‛)MO(AtoB);输出如
7、下:thetermAtoBisastring可以定义没有值的宏,尽管没有相关的宏,还是可以定义这样的宏被#ifdef和#ifndef用作测试的标记。可变的宏是具有可变数目参数的宏。这些参数由省略号代表,被保存在一个由逗号分隔的字符串中作为变量_VA_ARGS_,它会在宏内部进行扩展。#defineerr(…)fprintf(stderr,_VA_ARGS_)err(‚%s%d‛,‛theerrorcode‛,48);预处理输出为:fprintf(stderr,‛%s%d‛,‛theerrorcode‛,48);GCC学习之预处理程序byJetw
8、ay41.2、#error和#warning#error指示字会引起预处理程序报告致命错误或中
此文档下载收益归作者所有