【例】# define m(y*y+3*y) main i int s,y printf("input a number: 2特别注意:在宏定义 scanf(%od", &y) 中表达式(y*y+3*y)两边的 S=3*M+4*M+5*M 括号不能少。否则会发生 错误。如当作以下定义后: printf("s%dn" S) #difine myy+3y 3在宏展开时将得到下 1s=3*M+4*M+5*M在预处述语句: 理时经宏展开后该语句变为 s3*y*y+3*y+4*y*y+3* s3*(yy+3y)+4*(y*y+3*y)y+5*y*y+3*y; +5*(y*y+3*y)
【例】 #define M (y*y+3*y) main( ) { int s,y; printf("input a number: "); scanf("%d",&y); s=3*M+4*M+5*M; printf("s=%d\n",s); } 2.特别注意:在宏定义 中表达式(y*y+3*y)两边的 括号不能少。否则会发生 错误。如当作以下定义后: #difine M y*y+3*y 3.在宏展开时将得到下 述语句: s=3*y*y+3*y+4*y*y+3* y+5*y*y+3*y; 1.s=3*M+4*M+5*M在预处 理时经宏展开后该语句变为: s=3*(y*y+3*y)+4*(y*y+3*y) +5*(y*y+3*y);
对于宏定义说明 1)在宏展开只是一种简单的代换,预处理程序对 它不作任何检查。如有错误,只能在编译已被 宏展开后的源程序时发现。 2)宏定义不是说明或语句,在行末不必加分号, 如加上分号则连分号也一起置换。 3)宏定义必须写在函数之外,其作用域为宏定义 命令起到源程序结束。如要终止其作用域可使 用# undef命令
对于宏定义说明 : 1)在宏展开只是一种简单的代换,预处理程序对 它不作任何检查。如有错误,只能在编译已被 宏展开后的源程序时发现。 2)宏定义不是说明或语句,在行末不必加分号, 如加上分号则连分号也一起置换。 3)宏定义必须写在函数之外,其作用域为宏定义 命令起到源程序结束。如要终止其作用域可使 用# undef命令
例如 #define pi3. 14159 maino #undef pl flo 表示PI只在main函数中有效,在中无效
例如: #define PI 3.14159 main() { …… } #undef PI f1() { …… } 表示PI只在main函数中有效,在f1中无效