Как определить функцию как макрос? - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь преобразовать эту функцию как макрос, чтобы уменьшить строку кода.

void gotoxy(int x,int y)    //cursor placing
    {
        COORD coord;
        coord.X =x;
        coord.Y=y;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
    }

Как правильно записать эту функцию как макрос? Я попытался сделать это

#define gotoxy(x,y) COORD coord;coord.X = x;coord.Y = y ; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord)

, и он показывает [Ошибка] повторное определение «координаты» без привязки.

1 Ответ

1 голос
/ 02 августа 2020

Вам нужно связать операторы в одну область, используя {}. Обычный способ сделать это в макросе - это трюк «do while (0)»:

#define gotoxy(x, y) do { \
    COORD coord; \
    coord.X = x; \
    coord.Y = y; \
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); \
} while(0)

Область {} позволяет вам вводить локальные переменные. Здесь объясняется трюк с «do while (0)»: do {...} while (0) - для чего он нужен?

Но вы говорите, что делаете это чтобы уменьшить количество строк кода, поэтому вот лучший способ достичь этой странной цели:

void gotoxy(int x,int y){COORD coord; coord.X=x; coord.Y=y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);}

Конечно, вы никогда не должны писать код в этом стиле, но если кто-то угрожает убить вас, если вы не уменьшите количество строк кода в вашем проекте, это спасет вашу жизнь.

Наконец, из документации мы видим, что COORD - это структура, содержащая только X и Y, поэтому мы можно упростить это:

COORD coord;
coord.X=x;
coord.Y=y;

до этого:

COORD coord{x,y};

Это две строки, сохраненные без продажи вашей души препроцессору C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...