Для цикла в #define - PullRequest
       32

Для цикла в #define

3 голосов
/ 01 апреля 2010
#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 ]

5 голосов
/ 01 апреля 2010

Вы заключили цикл 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]);

EDIT:

Причина этого заключается в том, что грамматика C не позволяет statement (оператор iterative в этом случае) находиться внутри скобок, но допускает expression.

Вы можете взглянуть на грамматику C здесь .

2 голосов
/ 01 апреля 2010

Это ужасная идея ... вы просто должны сделать ее встроенной функцией. Однако проблема в том, что вы заключили свое определение в скобки, что делает его неверным. Снимите скобки, а также удалите точку с запятой в конце (чтобы после нее можно было поставить точку с запятой), и она должна работать.

Другими словами, измените ваше определение на:

#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)
1 голос
/ 01 апреля 2010
    #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;
}

Вам необходимо удалить () в заявление до и в конце

...