- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
c预处理过程与语句总结.
C/C++预处理过程与语句总结
转载请保留: (CNS电脑与英语学习网)
Author: cnscn
1)预处理
根据已放置在文件中的预处理指令来修改源文件的 内容
预处理器会分析\执行所有的预处理器指令,然后删除他们,得到一个仅包含C++语句的转换单元
预处理指令以#号开头
常用的预处理指令:
#include?????? 包含头文件
#if?????????????? 条件
#else????????? 否则
#elif??????????? 否则如果
#endif???????? 结束条件
#ifdef 或 #if defined??????? 如果定义了一个符号, 就执行操作
#ifndef 或 #if !defined????? 如果没有定义一个符号, 就指执行操作
#define??????? 定义一个符号
#undef???????? 删除一个符号
#line???????? ?? 重新定义当前行号和文件名
#error??????? 输出编译错误 消息, 停止编译
#pragma??????? 提供 机器专用的特性,同时保证与C++的完全兼容
2)#include 在 程序中包含头文件
头文件通常以.h结尾,其 内容可使用#include预处理器指令包含到 程序中
头文件中一般包含: 函数原型与全局变量
形式常有下面两种
#include iostream
#include myheader.h
前者用来引用标准库头文件,后者常用来引用自定义的头文件
前者编译器只搜索包含标准库头文件的默认 目录,后者首先搜索正在编译的源文件所在的 目录,找不到时再搜索包含标准库头文件的默认 目录.
如果把头文件放在其他 目录下,为了查找到它,必须在双引号中指定从源文件到头文件的完整路径
3)#define 定义符号、宏
1符号
#define PI 3.1415925 定义符号PI为3.1415925
#define PI 取消PI的值
这里PI看起来像一个变量,但它与变量没有任何关系,它只是一个符号或标志,在 程序代码编译前,此符号会用一组指定的字符来代替
3不是一个数值,只是一个字符串,不会进行检查
在编译前,预处理器会遍历代码,在它认为置换有意义的地方,用字符串PI的定义值(3来代替
在注释或字符串中的PI不进行替换
在C中常以#define来定义符号常量,但在C++中最好使用const 来定义常量
#define PI 3const long double PI=3
两者比较下,前者没有类型的指定容易引起不必须的麻烦,而后者定义清楚,所以在C++中推荐使用const来定义常量
#define的缺点:
?? 1)不支持类型检查
?? 2)不考虑作用域
?? 3)符号名不能限制在一个命名 空间中
2#undef 删除#define定义的符号
#define PI 3... //之间所有的PI都可以被替换为3#undef PI
之后不再有PI这个标识符
3定义宏
#define Print(Var) count(Var)endl
用宏名中的参数带入语句中的参数
宏后面没有;号
Print(Var)中的Print和(之间不能有空格,否则(就会被解释为置换字符串的一部分
#define Print(Var, digits) count setw(digits) (Var) endl
调用
Print(ival, 15)
预处理器就会把它换成
cout setw(15) (ival) endl;
所有的情况下都可以使用内联函数来代替宏,这样可以增强类型的检查
templateclass T inline void Print (const T var, const int digits)
{
????? countsetw(digits)varendl;
}
调用
Print(ival, 15);
使用宏时应注意的易引起的错误:
#define max(x,y) xy?x:y;+
调用 result = max(myval, 99); 则换成 result = myval99?myval:99; 这个没有问题是正确的
调用 result = max(myval++, 99); 则换成 result = myval++99?myval++:99; 这样如果myval99那么myval就会递增两次,这种情况下()是没什么用的如result=max((x),y)则 result = (myval++)99?(myval++):99;
再如
#define product(m,n) m*
文档评论(0)