- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
预编译处理及程序格式命名
预编译处理/程序格式命名 第九章? c/c++编译预处理
一、文件包含#include 头文件名称#include 头文件名称
第一种形式 : 用来包含开发环境提供的库头文件,它指示编译预处理器在开发环境设定的搜索路径中查找所需的头文件第二种形式 : 用来包含自己编写的头文件,它指示编译预处理器首先在当前工作目录下搜索头文件,如果找不到再到开发环境设定的路径中查找。
?
内部包含卫哨和外部包含卫哨
在头文件里面使用内部包含卫哨,就是使用一种标志宏,可以放心的在同一个编译单元及其包含的头文件中多次包含同一个头文件而不会造成重复包含。如:
#ifndef _STDDEF_H_INCLUDED_#define _STDDEF_H_INCLUDED_...... //头文件的内容#endif
?
当包含一个头文件的时候,如果能够始终如一地使用外部包含卫哨,可以显著地提高编译速度,因为当一个头文件被一个源文件反复包含多次时,可以避免多次查找和打开头文件地操作。如:
#if !defined(_INCLUDED_STDDEF_H_)#include stddef.h#define _INCLUDED_STDDEF_H_#endif
建议外部包含卫哨和内部包含卫哨使用同一个标志宏,这样可以少定义一个标志宏。如:
#if !defined_STDDEF_H_INCLUDED_#include stddef.h#endif
?
头文件包含的合理顺序在头文件中:1、包含当前工程中所需的自定义头文件2、包含第三方程序库的头文件3、包含标准头文件在源文件中:1、包含该源文件对应的头文件2、包含当前工程中所需的自定义头文件3、包含第三方程序库的头文件4、包含标准头文件
二、宏定义1、宏定义不是c/c++语句,所以不需要使用“;”结束2、任何宏在编译器处理阶段都只是进行简单的文本替换,不做类型检查和语法检查,这个工作留给编译器做3、宏定义可以嵌套4、宏不可以调试,因为宏不会进入符号表(符号表是编译器创建的,在之前宏已经消失了),即时宏替换后出了问题,编译器也会将错误定位到源程序中,而不是定位到具体的某个宏5、程序里使用双引号括起来的字符串中即时出现了与宏同名的子串,预编译过程也不进行替换6、定义带参数的宏时,宏名和左括号之间不能出现空格,否则使用会出问题,但是编译器不会检查这种错误如: #define TEXT (str)#str? cout TEXT(Hello World);? 将扩展为:? (str)#str(Hello World);? // TEXT 相当于 (str)#str7、带参数的宏体和各个形参应该分别用括号括起来。如:#define SQUARE(X)((X)*(X))如果写成:#define SQUARE(X)X*X那么a = SQUARE(3+5)将被扩展为:?? a?= 3+5*3+58、不要在引用宏定义的参数列表中使用增量和减量运算符,否则将导致变量多次求值int a = 5;int x = SQUARE(a++);结果为30,而不是25!因为将被扩展为:int x = ((n++)*(n++));9、带参数的宏定义不是函数,因为没有函数调用的开销,但是其每一次扩展都会生成重复的代码,使体积变大10、当不再使用某一个宏时,可以使用#undef来取消其定义。如:??? #undef TEXT
建议:给宏添加注释时请使用块注释(/**/),而不要使用行注释,因为有些编译器可能会把宏后面的行注释理解为宏体的一部分。??? 不要使用宏来定义新类型,使用typedef,否则容易造成错误。
条件编译#if, #elif和#else#define FALG_DOS??? 2#define FALG_UNIX?? 1#define FALG_WIN??? 0#define OS????????? 1
#if OS == FLAG_DOS? cout Dos endl;#elif OS == FLAG_UNIX? cout Unix endl;#elif OS == FLAG_WIN? cout Win endl;#endif
?
#ifdef 和 #ifndef#define XYZ...#ifdef XYZ? DoSomthing();#endif
?
#error编译伪指令#error用于输出与平台、环境有关的信息。
?
#pragma用于执行语言实现所定义的动作。#pragma comment(lib,user32.lib)
?
#和##运算符构串操作符#只能修饰带参数的宏的形参,它将实
您可能关注的文档
最近下载
- 三一SY235C9I2KS维护保养手册.pdf VIP
- 纪念中国人民抗日战争暨世界反法西斯战争胜利80周年PPT课件.pptx VIP
- 陶瓷原料及配方基础.ppt VIP
- 茶小绿叶蝉的防治课件.pptx VIP
- 电梯制造与安装安全规范 GB7588-2003.docx VIP
- 2023民航特种车辆操作工民航特种车辆操作工试卷(练习题库).docx VIP
- IEC 60840-2004 额定电压30kV(Um=36kV)以上至150kV(Um=170kV)挤包绝缘电力电缆及其附件试验方法和要求(中文).pdf VIP
- 22G101 三维彩色立体图集.docx VIP
- 混凝土混凝土.ppt VIP
- 沈萍微生物课件第3章b.ppt VIP
文档评论(0)