首页 理论教育C语言带参宏定义示例

C语言带参宏定义示例

【摘要】:宏也可以带参数,其定义的一般形式为:#define标识符 字符串其中标识符是宏名,字符串中包含括号内指定的参数,称为宏扩展。这时由于带参数的宏从形式上看很像函数,为了统一,多数人在定义带参数的宏时喜欢使用小写字母。

宏也可以带参数,其定义的一般形式为:

#define标识符(参数列表) 字符串

其中标识符是宏名,字符串中包含括号内指定的参数,称为宏扩展。例如:

#define area(r) (3.1415926*(r)*(r))

这里r作为宏area的参数,定义之后可在程序中使用它。例如:

我们注意到这里宏的名字用的是小写字母。这时由于带参数的宏从形式上看很像函数,为了统一,多数人在定义带参数的宏时喜欢使用小写字母。

宏也可以带多个参数。例如,求两个数中较大者,我们可以定义宏

#define max(x,y) ((x)>(y)?(x):(y))

如果在程序中出现语句

m=max(a,b);

则预处理时替换为

m=((a)>(b)?(a):(b));

使用带参数的宏编写程序时,要特别注意两点:

(1)在宏定义中宏名和括起参数的左圆括号之间不能有空格。

如果宏定义为

#define area(r) (3.1415926*(r)*(r))

则语句

printf(“%f\n”,area(2.0));

被替换为(www.chuimin.cn)

printf(“%f\n”,(r) (3.1415926*(r)*(r))(2.0));

这显然是不对的。因为预处理程序把area认做是一个不带参数的宏,只是简单地把其后所跟字符串原样搬到area处。

(2)整个宏扩展及各参数要用括号括起,就像前面给出的例子那样。如果不用括号括起会出现什么情况呢?例如,我们来定义一个求平方的宏。

#define square(x)x*x

如果有语句

a=square(n+1);

则预处理时被替换为

a=n+1*n+1;

结果是把2*n+1赋给了a,显然这不是我们所期望的

a=(n+1)*(n+1);

宏扩展中最外层的括号也是必要的。如果不要最外层的括号,宏定义写成

#define square(x) (x)*(x)

如果遇到下面的语句调用宏

printf(“%d\n”,27/square(3));

我们可以先猜猜看输出结果是什么。是3吗?让我们替换一下,变成

printf(“%d\n”,27/(3)*(3));

由于*和/同级,并按从左到右顺序计算,所以表达式27/(3)*(3)的值为27,这不是我们所期望的值,这就是为什么我们要用括号括起整个宏扩展了。