我正在尝试打印字符串' x'使用宏作为参数的次数,使用以下代码: -
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);
^
但是在编译时,我收到以下错误: -
for(int i = 1; i <= 50; i++){
if(i % 10 != 0){
Console.Write(i);
Console.Write(" ");
}
}
我无法弄清楚问题,请帮助谢谢。
答案 0 :(得分:3)
马克扩张后,这句话
print(5,c);
变为
while(5>0) { puts(c); printf("\n"); --5; };
如您所见,您无法减少文字值(--5
)。您需要一个变量(一个可修改的左值)才能实现这一点。你的marco看起来多余了。你可以简单地使用一个循环:
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)
答案 1 :(得分: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);