c 预处理

上传人:小** 文档编号:89123038 上传时间:2019-05-18 格式:DOC 页数:7 大小:21.50KB
返回 下载 相关 举报
c   预处理_第1页
第1页 / 共7页
c   预处理_第2页
第2页 / 共7页
c   预处理_第3页
第3页 / 共7页
c   预处理_第4页
第4页 / 共7页
c   预处理_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《c 预处理》由会员分享,可在线阅读,更多相关《c 预处理(7页珍藏版)》请在金锄头文库上搜索。

1、C 预处理C+预处理2010-03-3018:471)常用的预处理:#include包含头文件#if条件#else否则#elif否则如果#endif结束条件#ifdef或#ifdefined如果定义了一个符号,就执行操作#ifndef或#if!defined如果没有定义一个符号,就指执行操作#define定义一个符号#undef删除一个符号#line重新定义当前行号和文件名#error输出编译错误消息,停止编译#pragma提供机器专用的特性,同时保证与C+的完全兼容2)#include在程序中包含头文件头文件通常以.h结尾,其内容可使用#include预处理器指令包含到程序中头文件中一般包含

2、:函数原型与全局变量形式常有下面两种#includeiostream#includemyheader.h前者用来引用标准库头文件,后者常用来引用自定义的头文件前者编译器只搜索包含标准库头文件的默认目录,后者首先搜索正在编译的源文件所在的目录,找不到时再搜索包含标准库头文件的默认目录.如果把头文件放在其他目录下,为了查找到它,必须在双引号中指定从源文件到头文件的完整路径3)#define定义符号、宏1符号#definePI3.1415925定义符号PI为3.1415925#definePI取消PI的值这里PI看起来像一个变量,但它与变量没有任何关系,它只是一个符号或标志,在程序代码编译前,此符号

3、会用一组指定的字符来代替3.14159265不是一个数值,只是一个字符串,不会进行检查在编译前,预处理器会遍历代码,在它认为置换有意义的地方,用字符串PI的定义值(3.14159265)来代替在注释或字符串中的PI不进行替换在C中常以#define来定义符号常量,但在C+中最好使用const来定义常量#definePI3.14159265constlongdoublePI=3.14159265;两者比较下,前者没有类型的指定容易引起不必须的麻烦,而后者定义清楚,所以在C+中推荐使用const来定义常量#define的缺点:1)不支持类型检查2)不考虑作用域3)符号名不能限制在一个命名空间中2#

4、undef删除#define定义的符号#definePI3.14159265./之间所有的PI都可以被替换为3.14159265#undefPI之后不再有PI这个标识符3定义宏#definePrint(Var)count(Var)endl用宏名中的参数带入语句中的参数宏后面没有;号Print(Var)中的Print和(之间不能有空格,否则(就会被解释为置换字符串的一部分#definePrint(Var,digits)countsetw(digits)(Var)endl调用Print(ival,15)预处理器就会把它换成coutsetw(15)(ival)endl;所有的情况下都可以使用内联函数

5、来代替宏,这样可以增强类型的检查templateclassTinlinevoidPrint(constT&var,constint&digits)countsetw(digits)varendl;调用Print(ival,15);使用宏时应注意的易引起的错误:#definemax(x,y)xy?x:y;+调用result=max(myval,99);则换成result=myval99?myval:99;这个没有问题是正确的调用result=max(myval+,99);则换成result=myval+99?myval+:99;这样如果myval99那么myval就会递增两次,这种情况下()是没

6、什么用的如result=max(x),y)则result=(myval+)99?(myval+):99;再如#defineproduct(m,n)m*n调用result=product(5+1,6);则替换为result=5+1*6;所以产生了错误的结果,此时应使用()把参数括起#defineproduct(m,n)(m)*(n)则result=product(5+1,6);则替换为result=(5+1)*(6);所以产生了错误的结果,此时应使用()把参数括起结论:一般用内联函数来代替预处理器宏技巧:1)给替换变量加引号#defineMYSTRIloveyoucoutMYSTR;/Ilove

7、you而不是Iloveyou如果coutMYSTR;/则会输出MYSTR而不是Iloveyou可以这样做cout#MYSTR;/则会输出Iloveyou即coutIloveyou;2)在宏表达式中连接几个参数如#definejoin(a,b)ab这样不会理解为参数a的值与参数b的值的连接,即如join(10,999)不会理解为10999而是把ab理解为字符串,即输出ab这时可以#definejoin(a,b)a#b则join(10,999)就会输出109993)逻辑预处理器指令#ifdefinedCALCAVERAGE或#ifdefCALCAVERAGEintcount=sizeof(data

8、)/sizeof(data0);for(inti=0;icount;i+)average+=data;average/=count;#endif如果已经定义符号CALCAVERAGE则把#if与#endif间的语句放在要编译的源代码内防止重复引入某些头文件#ifndefCOMPARE_H#defineCOMPARE_H注意:这里只是定义一个没有值的符号COMPARE_H,下面的namespacecompare不是COMPARE_H的内容,这里的定义不像是定义一个常量或宏,仅仅定义一个符号,指出此符号已定义,则就会有下面的内容namespacecompare.namespacecomparedo

9、ublemax(constdouble*data,intsize);doublemin(constdouble*data,intsize);#endif比较#defineVERSION3因为有换行符所以上句等价于#defineVERSION3由此可以看出#defineCOMPARE_H与namespacecompare是独立没有关系的两个行也可以这样用#ifdefinedblock1&definedblock2#endif#ifCPU=PENTIUM4#endif#ifLANGUAGE=ENGLISH#defineGreetingGoodMorning.#elifLANGUAGE=GERMAN

10、#defineGreetingGutenTag.#elifLANGUAGE=FRENCH#defineGreetingBonjour.#else#defineGreetingHi.#endifstd:coutGreetingstd:endl;#ifVERSION=3#elifVERSION=4#else#endif5)标准的预处理器宏_LINE_当前源文件中的代码行号,十进制整数_FILE_源文件的名称,字符串字面量_DATE_源文件的处理日期,字符串字面量,格式mmmddyyyy其中mmm是月份如Jan、Feb等dd是01-31yyyy是四位的年份_TIME_源文件的编译时间,也是字符串字面

11、量格式是hh:mm:ss_STDC_这取决于实现方式,如果编译器选项设置为编译标准的C代码,通常就定义它,否则就不定义它_cplusplus在编译C+程序时,它就定义为199711L使用#line可以修改_FILE_返回的字符串如#line1000把当前行号设置为1000#line1000theprogramfile修改_FILE_返回的字符串行号改为了1000,文件名改为了theprogramfile#line_LINE_theprogramfile修改_FILE_返回的字符串行号没变,文件名改为了theprogramfilecoutprogramlastcompliedat_TIME_on

12、_DATE_endl;6)#error在预处理阶段,如果出现了错误,则#error指令可以生成一个诊断消息,并显示为一个编译错误,同时中止编译#ifndef_cplusplus#errorError-ShouldbeC+#endif7)#pragma专门用于实现预先定义好的选项,其结果在编译器说明文档中进行了详细的解释。编译器未识别出来的#pragma指令都会被忽略8)assert()宏在标准库头文件cassert中声明用于在程序中测试一个逻辑表达式,如果逻辑表达式为false,则assert()会终止程序,并显示诊断消息用于在条件不满足就会出现重大错误,所以应确保后面的语句不应再继续执行,所

13、以它的应用非常灵活注意:assert不是错误处理机制,逻辑表达式的结果不应产生负面效果,也不应超出程序员的控制(如找开一个文件是否成功),程序应提供适当的代码来处理这种情况assert(expression);assert(expression)&assert(expression2);可以使用#defineNDEBUG来关闭断言机制#includeiostream#includecassertusingstd:cout;usingstd:endl;intmain()intx=0;inty=0;coutendl;for(x=0;x20;x+)coutx=xy=yendl;assert(xy);/当x=y与x=5时,就报错,并终止程序的执行return0;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号