正在加载图片...
例如 #define M (y*y+3 *y) 它的作用是指定标识符M来代替表达式(y*y+3*y)。在编写源程序时,所有的(y*y+3*y) 都可由M代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(y*y+3*y)表达式 去置换所有的宏名M,然后再进行编译 【例9.1】 #define m (y*y+3*y) no Int s, y printf( input a number: scanf(%d", &y) S=3*M+4米M printf("s=%d\n", s) 包 上例程序中首先进行宏定义,定义M来替代表达式(y*y+3*y),在S=3*M+4*M+5*M中作了 宏调用。在预处理时经宏展开后该语句变为: s=3*(y*y+3*y)+4*(y*y+3米y)+5米(y*y+3米y) 但要注意的是,在宏定义中表达式(y*y+3*y)两边的括号不能少。否则会发生错误。如当作以 下定义后: #difine M y*y+3*y 在宏展开时将得到下述语句 s=3*y来y+3y+4*y*y+3y+5y*y+3y; 这相当于 3y2+3y+4y2+3y+5y2+3y; 显然与原题意要求不符。计算结果当然是错误的。因此在作宏定义时必须十分注意。应保证 在宏代换之后不发生错误。 对于宏定义还要说明以下几点: 1)宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是 种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理 程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现 2)宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换 3)宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作 用域可使用# undef命令。 例如 #define pi 3. 14159 main例如: #define M (y*y+3*y) 它的作用是指定标识符 M 来代替表达式(y*y+3*y)。在编写源程序时,所有的(y*y+3*y) 都可由 M 代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(y*y+3*y)表达式 去置换所有的宏名 M,然后再进行编译。 【例 9.1】 #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); } 上例程序中首先进行宏定义,定义 M 来替代表达式(y*y+3*y),在 s=3*M+4*M+5* M 中作了 宏调用。在预处理时经宏展开后该语句变为: s=3*(y*y+3*y)+4*(y*y+3*y)+5*(y*y+3*y); 但要注意的是,在宏定义中表达式(y*y+3*y)两边的括号不能少。否则会发生错误。如当作以 下定义后: #difine M y*y+3*y 在宏展开时将得到下述语句: s=3*y*y+3*y+4*y*y+3*y+5*y*y+3*y; 这相当于: 3y2 +3y+4y2 +3y+5y2 +3y; 显然与原题意要求不符。计算结果当然是错误的。因此在作宏定义时必须十分注意。应保证 在宏代换之后不发生错误。 对于宏定义还要说明以下几点: 1) 宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一 种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理 程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。 2) 宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。 3) 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作 用域可使用# undef 命令。 例如: #define PI 3.14159 main() { …… }
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有