宏是文本替换,不做任何计算

    技术2025-09-11  16

    看到csdn的一个帖子,总结如下。

     

    帖子如下:

     

    #define定义的仅仅是“替换”吗?它竟然能计算!

     

    [Quote=引用楼主 johnphan 的回复:]#define five 2+2+1这个five是在那里计算的呢?经过程序验证,是在#define five 2+3这句中就计算了。(也就是预处理器preprocessor计算的)而不是先替换,然后在程序中完成计算的。但在正式的课本中没有查到有关的论述。谁能给出这方面的参考资料?[/Quote]

     

     

     

    [Quote=引用 3 楼 arong1234 的回复:]这和宏没有什么关系int i = 2+2+1; //这里也是直接就在编译时就计算了,不是说你用了宏因此在宏那里计算了,实际上计算还是文本替换后进行的

    引用楼主 johnphan 的回复:#define five 2+2+1这个five是在那里计算的呢?经过程序验证,是在#define five 2+3这句中就计算了。(也就是预处理器preprocessor计算的)而不是先……[/Quote]

     

    [Quote=引用 4 楼 dragonbooker 的回复:]提醒楼主:这个宏可能存在问题,如:

    #define five 2+2+1

    if( five * 2 == 10){  printf("ok/n");}else{  printf("error/n");}

    你会得到error的输出。[/Quote]

     

    这也证明计算不是宏做的,而是替换之后作的

     

     

    你只要记住宏是文本替换,不做任何计算就可以了,你后面那些问题只要你明白这个,就不是问题

     

    [Quote=引用 15 楼 johnphan 的回复:]                   这个帖子是错误的,不足以说明楼主的问题,但是帖子本身内容很重要。还是将老外的这一段文字附在这里,供大家评论吧

    面试题目:用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)

    答案:#define SECONDS_PER_YEAR (60 * 60 * 24 * 365UL)

    在这考察几件事情: 1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2). 懂得预处理器将……[/Quote]

     

    [Quote=引用 16 楼 bluesky12312388 的回复:]#define SECONDS_PER_YEAR (60 * 60 * 24 * 365UL) 因为这个宏定义用的是乘法,乘法优先级比较高,你将“碰巧”可以证明你那个错误的结论[/Quote]

     

     

    [Quote=引用 22 楼 bluesky12312388 的回复:]引用 19 楼 bluesky12312388 的回复:

    #define FIVE 2+3#if FIVE < 4 //这个恒为真  2 + 3 < 4 结果为2 + 0 = 2,LZ你真的可以死心了

    上面的搞错了,但绝对不是在宏定义的时候计算的[/Quote]

     

     

    [Quote=引用 29 楼 redleaves 的回复:]宏展开是不会计算的.但像#if这一类的条件预处理语句会进行简单的表达式求值.不过还是可以通过一些BT的写法,用宏模拟出一些类似"计算"的行为...[/Quote]

    最新回复(0)