【问题标题】:How to define function as macro?如何将函数定义为宏?
【发布时间】:2020-11-22 12:51:44
【问题描述】:

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

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'没有链接。

【问题讨论】:

  • 宏是魔鬼的发明。您应该将宏 转换为 函数,而不是相反。
  • 至于“减少代码行”的目标,不要。你要做的是让代码更难阅读、理解和维护。源代码大小与优化后的可执行程序的大小关系不大。

标签: c function macros


【解决方案1】:

您需要使用 {} 将语句捆绑到一个范围内。在宏中执行此操作的常用方法是“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 预处理器的情况下节省了两行代码。

【讨论】:

    猜你喜欢
    • 2012-09-07
    • 2013-12-28
    • 2013-06-04
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    相关资源
    最近更新 更多