#include <stdio.h>
#define UNITS {'*', '#', '%', '!', '+', '$', '=', '-'}
#define PrintDigit(c, d) (for (i=0; i < c ; i++)putchar(unit[d]);)
char unit[] = UNITS;
//void PrintDigit(c, element) {
// int i;
// for (i=0; i < c ; i++)
// putchar(unit[element]);
//}
int main( ) {
int i, element=4;
PrintDigit(10, element);
putchar('\n');
return 0;
}
我这里的函数PrintDigit()
按预期工作。当试图将函数转换为#define时,gcc不断在for循环中抛出语法错误。知道问题是什么吗?
答案 0 :(得分:5)
您已将for
循环括在括号中,您需要删除它。
更改
#define PrintDigit(c, d) (for(i=0; i < c ; i++)putchar(unit[d]);)
到
#define PrintDigit(c, d) for(i=0; i < c ; i++)putchar(unit[d]);
修改强>
原因是C语法不允许statement
(在这种情况下为iterative
语句)在括号内但允许expression
。
您可以查看C语法here。
答案 1 :(得分:2)
这是一个糟糕的主意......你应该把它变成内联功能。但是,问题是您在括号中包含了您的定义,这使得它不正确。删除括号并删除末尾的分号(以便在其后面放置分号),它应该可以工作。
换句话说,将您的定义更改为:
#define PrintDigit(c, d) \ for (int i = 0; i < c ; i++) \ putchar(unit[d])
通过将其放在内部范围内,您可以使它变得不那么脆弱:
#define PrintDigit(c,d) \ do{\ for (int i = 0; i < c; i++ ) { \ putchar(unit[d]); \ }\ }while(0)
答案 2 :(得分:1)
#include <stdio.h>
#define UNITS {'*', '#', '%', '!', '+', '$', '=', '-'}
#define PrintDigit(c, d) for (i=0; i < c ; i++)putchar(unit[d]);
char unit[] = UNITS;
//void PrintDigit(c, element) {
// int i;
// for (i=0; i < c ; i++)
// putchar(unit[element]);
//}
int main( ) {
int i, element=4;
PrintDigit(10, element);
putchar('\n');
return 0;
}
您需要删除for中的() 陈述前和后