getmaxyx 是如何工作的? (来自诅咒)

How does getmaxyx work? (from curses)

我对 "function" getmaxyx 的工作原理感到困惑...因为我知道它实际上是一个宏。但是这个宏是如何工作的呢?

代码示例:

#include <ncurses.h>

int main() {
  int col, row;
  initscr();
  getmaxyx(stdscr,row,col);
  endwin();
  return 0;
}

阅读ncurses.h头文件发现getmaxyx确实是一个宏:

#define getmaxyx(win,y,x)       (y = getmaxy(win), x = getmaxx(win))

进一步调查发现getmaxygetmaxx也是宏:

#define getmaxx(win)            ((win) ? ((win)->_maxx + 1) : ERR)
#define getmaxy(win)            ((win) ? ((win)->_maxy + 1) : ERR)

现在,参数 win 是指向 WINDOW 的指针。事实上,WINDOWstruct _win_st 的类型定义。细读这个结构揭示了字段:

NCURSES_SIZE_T _maxy, _maxx; /* maximums of x and y, NOT window size */

因此,当创建一个新的 window 时,它与包含有关 window 的信息的 WINDOW 结构相关联。特别是,window 的最大 x 和 y 坐标存储在字段 _maxx_maxy 中。这些字段由宏 getmaxyx() 访问以提供 window 维度。