我试图打印一个字符串'x'次使用宏作为参数与以下代码:-
1 #include<string.h>
2 #include<stdio.h>
3 #define print(x,c) while(x>0)
4 {
5 puts(c);
6 printf("n");
7 --x;
8 }
9
10 int main()
11 {
12 char c[20];
13 strcpy(c,"Hallelujah");
14 print(5,c);
15 }
但是在编译时,我得到以下错误:-
macro2.c: In function ‘main’:
macro2.c:7:2: error: lvalue required as decrement operand
--x;
^
macro2.c:14:2: note: in expansion of macro ‘print’
print(5,c);
^
我无法解决这个问题,请帮忙,谢谢。
marco展开后,下面的语句
print(5,c);
是
while(5>0) { puts(c); printf("n"); --5; };
可以看到,不能减少文字值(--5
)。您需要一个变量(一个可修改的左值)来实现这一点。你的马可看起来多余。你可以简单地使用一个循环:
int x = 5;
while(x > 0) {
puts(c);
printf("n");
--x;
}
如果你真的想要使用宏,那么你可以这样做:
#define print(x,c) do {
int t = x;
while(t>0) {
puts(c);
printf("n");
--t;
}
} while(0)
宏由预处理器展开,并将结果交给编译器。
您的代码将扩展为:
int main()
{
char c[20];
strcpy(c,"Hallelujah");
while(5>0)
{
puts(c);
printf("n");
--5;
}
}
可以看到,在每个实例中,x
被替换为实际的参数表达式。它的工作方式与常规函数不同,常规函数的参数变量是表达式值的局部副本。
我建议您将宏转换为C函数,或者在调用宏之前声明一个变量来保存该值。
第二个选项看起来像这样:
int n = 5;
print(n,c);