如何将函数定义为宏?
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 预处理器,就节省了两行代码。
我正在尝试将此函数转换为宏以减少代码行数。
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 预处理器,就节省了两行代码。