为什么init_pair在COLOR_PAIRS范围的一半范围内失败?

时间:2019-01-04 23:52:09

标签: c ncurses

在我的平台上:

  • OSX Mojave 10.14.2
  • 从自制软件中获取:

    $ brew info ncurses
    ncurses: stable 6.1 (bottled) [keg-only]
    

通过以下makefile配置进行构建:

pkgenv=PKG_CONFIG_PATH=/usr/local/opt/ncurses/lib/pkgconfig pkg-config ncursesw

flags=-Wall -std=c17 -ggdb
cflags=$(flags) $(shell $(pkgenv) --cflags)
ldflags=$(flags) $(shell $(pkgenv) --libs)

此最小可复制示例失败:

#include <assert.h>
#include <ncursesw/ncurses.h>

int main() {
    assert(NULL != initscr());
    assert(has_colors());
    assert(can_change_color());

    assert(ERR != start_color());
    assert(COLOR_PAIRS == 0x10000);
    assert(COLORS == 256);
    assert(ERR != init_pair(1, 9, 10));
    assert(ERR != init_pair(0x7FFE, 9, 10));
    // OK up to here

    // Fails
    assert(ERR != init_pair(0x7FFF, 9, 10));

    endwin();
    puts("OK");
    return 0;
}

但是为什么呢? COLOR_PAIRS报告(65536)和init_pair接受(1-32766)似乎是两件事。值得一看的是,浏览头文件,

#define NCURSES_PAIRS_T short

奇怪的是,他们为此选择了签名数量。

1 个答案:

答案 0 :(得分:2)

颜色对的standard type是带符号的 short ,在大多数计算机上是16位。原因是它可以追溯到1980年代,当时空间(和颜色的可用性)更加有限。

ncurses 6.1的扩展名允许使用32位值(例如,使用init_extended_pair),虽然没有人使用,但 brew formula似乎允许到目前为止对此发表了评论。

init_pair手册页的Portability部分所述

  

X /开放式光标 未指定颜色和颜色的限制          终端可以支持的颜色对。但是,在使用上短          对于参数,它将保留 SVr4 的实现详细信息          已编译的terminfo数据库,该数据库使用带符号的16位数字。这个          实现提供了使用这些功能的扩展版本          短参数,允许应用程序使用更大的颜色和成对          数字。

为了娱乐,here屏幕截图使用了ncurses 6.1的扩展号码功能