宏定义
时间:2010-10-12 来源:huxuelin1989
一、定义一个常量
#define PI 3.1415
二、定义一个表达式 #define MAX(a, b) ((a) > (b) ? (a) : (b))
三、定义多条语句
第一种:#define EXCH(a, b) a = a + b; b = a - b; a = a - b;
从语法上说当然没错,但用到if()语句中时可能会出问题,如:
看起来好像是如果if()中的表达式为TRUE,则执行EXCH(a, b),但实际会变成:
这显然达不到想要的效果。
第二种: #define EXCH(a, b) { a = a + b; b = a - b; a = a - b; }
这种定义在调用时既没有返回值,又不能在调用后加分号,如:
这会被解释为:
这显然语法上就不正确。 但如果写成
这虽然正确, 但作为一条语句没有分号总感觉怪怪的, 所以出现了第三种情况。
第三种: #define EXCH(a, b) do { a = a + b; b = a - b; a = a - b; } while(0)
调用:
解释为:
第四种: #define EXCH(a, b) ({ a = a + b; b = a - b; a = a - b; })
这种在调用时有返回值,它的适用情况是放在if、while等的条件判断中,如:
它的返回值是最后一条语句的值。
第五种: #define EXCH(a, b) ( a = a + b, b = a - b, a = a - b )
这种写法也是正确的,但作为多条语句,如果用逗号隔开总觉得怪怪的,所以这种写法不常用。
二、定义一个表达式 #define MAX(a, b) ((a) > (b) ? (a) : (b))
三、定义多条语句
第一种:#define EXCH(a, b) a = a + b; b = a - b; a = a - b;
从语法上说当然没错,但用到if()语句中时可能会出问题,如:
if(表达式) |
看起来好像是如果if()中的表达式为TRUE,则执行EXCH(a, b),但实际会变成:
if(表达式) |
这显然达不到想要的效果。
第二种: #define EXCH(a, b) { a = a + b; b = a - b; a = a - b; }
这种定义在调用时既没有返回值,又不能在调用后加分号,如:
EXCH(a, b); |
这会被解释为:
{ a = a + b; b = a - b; a = a - b; }; |
这显然语法上就不正确。 但如果写成
EXCH(a, b) |
这虽然正确, 但作为一条语句没有分号总感觉怪怪的, 所以出现了第三种情况。
第三种: #define EXCH(a, b) do { a = a + b; b = a - b; a = a - b; } while(0)
调用:
EXCH(a, b); |
解释为:
do { a = a + b; b = a - b; a = a - b; } while(0); |
第四种: #define EXCH(a, b) ({ a = a + b; b = a - b; a = a - b; })
这种在调用时有返回值,它的适用情况是放在if、while等的条件判断中,如:
if(EXCH(a, b)) |
它的返回值是最后一条语句的值。
第五种: #define EXCH(a, b) ( a = a + b, b = a - b, a = a - b )
这种写法也是正确的,但作为多条语句,如果用逗号隔开总觉得怪怪的,所以这种写法不常用。
相关阅读 更多 +