对于#define中的循环

时间:2010-04-01 06:58:51

标签: c loops for-loop c-preprocessor

#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循环中抛出语法错误。知道问题是什么吗?

3 个答案:

答案 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中的()   陈述前和后