- 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语言宏定义
参考:/cpp/html/468.html
数值宏常量
#define PI 3.141592654
#define ERROR_POWEROFF -1
字符串宏常量
除了定义宏常数之外,经常还用来定义字符串,尤其是路径:
1、#define ENG_PATH_1 E:\English\listen_to_this\listen_to_this_3
2、#define ENG_PATH_2 “E:\English\listen_to_this\listen_to_this_3”
到底哪一个正确呢?如果路径太长,一行写下来比较别扭怎么办?用反斜杠接续符啊:
3、#define ENG_PATH_3 E:\English\listen_to_this\listen\_to_this_3
还没发现问题?这里用了4 个反斜杠,到底哪个是接续符?回去看看接续符反斜杠。
反斜杠作为接续符时,在本行其后面不能再有任何字符,空格都不行。所以,只有最后一个反斜杠才是接续符。至于1和2,那要看你怎么用了,既然define 宏只是简单的替换,那给ENG_PATH_1 加上双引号不就成了:“ENG_PATH_1”。
但是请注意:有的系统里规定路径的要用双反斜杠“\\”,比如:
#define ENG_PATH_4 E:\\English\\listen_to_this\\listen_to_this_3
用define宏定义注释符号??
上面对define 的使用都很简单,再看看下面的例子:
#define BSC //
#define BMC /*
#define EMC */
D),BSC my single-line comment
E),BMC my multi-line comment EMC
D)和E)都错误,为什么呢?因为注释先于预处理指令被处理,当这两行被展开成//…或/*…*/时,注释已处理完毕,此时再出现//…或/*…*/自然错误.因此,试图用宏开始或结束一段注释是不行的。所以,不能用宏定义注释符号
四、用define宏定义表达式
下面来点有“技术含量”的,定义一年有多少秒:
#define SEC_A_YEAR 60*60*24*365
这个定义没错吧?很遗憾,很有可能错了,至少不可靠。你有没有考虑在16 位系统下把这样一个数赋给整型变量的时候可能会发生溢出?一年有多少秒也不可能是负数吧。修改一下:
#define SEC_A_YEAR (60*60*24*365)UL
又出现一个问题,这里的括号到底需不需要呢?继续看一个例子,定义一个宏函数,求x 的平方:#define SQR (x) x * x 对不对?试试:假设x 的值为10,SQR (x)被替换后变成10*10。没有问题。再试试:假设x 的值是个表达式10+1,SQR (x)被替换后变成10+1*10+1。问题来了,这并不是我想要得到的。怎么办?括号括起来不就完了?
#define SQR (x) ((x)*(x))
最外层的括号最好也别省了,看例子,求两个数的和:
#define SUM (x) (x)+(x)
如果x 的值是个表达式5*3,而代码又写成这样:SUM (x)* SUM (x)。替换后变成:(5*3)+(5*3)*(5*3)+(5*3)。又错了!所以最外层的括号最好也别省了。我说过define 是个演技高超的替身演员,但也经常耍大牌。要搞定它其实很简单,别吝啬括号就行了
五、#undef
#undef 是用来撤销宏定义的,用法如下:
#define PI 3.141592654
…
// code
#undef PI
//下面的代码就不能用PI 了,它已经被撤销了宏定义。
也就是说宏的生命周期从#define 开始到#undef 结束。很简单,但是请思考一下这个问题:
#define X 3
#define Y X*2
#undef X
#define X 2
int z=Y;
z 的值为多少?
六、宏定义中的空格
另外还有一个问题需要引起注意,看下面例子:
#define SUM (x) (x)+(x)
这还是定义的宏函数SUM(x)吗?显然不是。编译器认为这是定义了一个宏:SUM,其代表的是(x) (x)+(x)。
为什么会这样呢?其关键问题还是在于SUM 后面的这个空格。所以在定义宏的时候一定要注意什么时候该用空格,什么时候不该用空格。这个空格仅仅在定义的时候有效,在使用这个宏函数的时候,空格会被编译器忽略掉。也就是说,上一节定义好的宏函数SUM(x)在使用的时候在SUM 和(x)之间留有空格是没问题的。比如:SUM(3)和SUM (3)的意思是一样的。
C语言中的条件编译#ifd
您可能关注的文档
最近下载
- T_CECA20011-2021:含铁含锰地下水接触氧化法给水处理技术规程.pdf VIP
- 事故应急技术第一章 应急管理概论课件.ppt VIP
- 包括乘用车项目风险管理分析报告(仅供参考).docx VIP
- 高中物理必修2机械能守恒练习题.pdf VIP
- BS EN 573-3-2019 铝和铝合金.锻制产品的化学成分和形式.第3部分:产品的化学成分和形 式.pdf VIP
- 学堂在线 高技术与现代局部战争 章节测试答案.docx VIP
- 风光储电站成本构成全套.docx VIP
- 数字信号处理(英文版)教学课件.ppt VIP
- 白话机器学习算法.pdf VIP
- 职业技术学院网络营销与直播电商专业人才培养方案(2024版).pdf VIP
文档评论(0)