如何将函数定义为宏?

How to define function as macro?

我正在尝试将此函数转换为宏以减少代码行数。

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)

它显示 [错误] 重新声明 'coord' 没有链接。

您需要使用 {} 将语句捆绑到一个范围内。在宏中执行此操作的常用方法是“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) — what is it good for?

但是您说您这样做是为了减少代码行数,所以这里有一个更好的方法来实现这个奇怪的目标:

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

当然你永远不应该写这种风格的代码,但是如果有人威胁说如果你不减少项目中的代码行数就杀了你,上面的方法会救你的命。

最后,从documentation我们可以看出,COORD是一个只包含X和Y的结构体,所以我们可以简化一下:

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

对此:

COORD coord{x,y};

无需将灵魂出卖给 C 预处理器,就节省了两行代码。