- 1、本文档共131页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
。 噢,到底哪一个正确呢?如果路径太长,一行写下来比较别扭怎么办?用反斜杠接续 符啊: C), #define ENG_PATH_3 E:\English\listen_to_this\listen\ _to_this_3 还没发现问题?这里用了 4 个反斜杠,到底哪个是接续符?回去看看接续符反斜杠。 反斜杠作为接续符时,在本行其后面不能再有任何字符,空格都不行。所以,只有最后一 个反斜杠才是接续符。至于 A)和 B),那要看你怎么用了,既然 define 宏只是简单的替换, 那给 ENG_PATH_1 加上双引号不就成了:“ENG_PATH_1” 但是请注意:有的系统里规定路径的要用双反斜杠“\\”,比如: #define ENG_PATH_4 E:\\English\\listen_to_this\\listen_to_this_3 3.1.3,用 define 宏定义注释符号? 上面对 define 的使用都很简单,再看看下面的例子: #define BSC // #define BMC /* #define EMC */ D),BSC my single-line comment E),BMC my multi-line comment EMC D)和 E)都错误,为什么呢?因为注释先于预处理指令被处理,当这两行被展开成//…或 /*…*/时,注释已处理完毕,此时再出现//…或/*…*/自然错误.因此,试图用宏开始或结束一段 注释是不行的。 3.1.4,用 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 是个 演技高超的替身演员,但也经常耍大牌。要搞定它其实很简单,别吝啬括号就行了。 注意这一点:宏函数被调用时是以实参代换形参。而不是“值传送”。 留四个问题: A),上述宏定义中“SUM”“SQR”是宏吗? B),#define EMPTY 这样定义行吗? C),打印上述宏定义的值:printf(“SUM (x)”);结果是什么? D), “#define M 100”是宏定义吗? 3.1.5,宏定义中的空格 另外还有一个问题需要引起注意,看下面例子: #define SUM (x) (x)+(x) 这还是定义的宏函数 SUM(x)吗?显然不是。编译器认为这是定义了一个宏:SUM, 其代表的是(x) (x)+(x)。为什么会这样呢?其关键问题还是在于 SUM 后面的这个空 格。所以在定义宏的时候一定要注意什么时候该用空格,什么时候不该用空格。这个空格仅 仅在定义的时候有效,在使用这个宏函数的时候,空格会被编译器忽略掉。也就是说,上一 节定义好的宏函数 SUM(x)在使用的时候在 SUM 和(x)之间留有空格是没问题的。比 如:SUM(3)和 SUM (3)的意思是一样的。 3.1.6,#undef #undef 是用来撤销宏定义的,用法如下: #define PI 3.141592654 … // code 精品文档 #undef PI //下面的代码就不能用 PI 了,它已经被撤销了宏定义。 也就是说宏的生命周期从#define 开始到#undef 结束。很简单,但是请思考一下这个问题: #define X
文档评论(0)