Если я печатаю символ, используя chtype
, объект-контейнер ncurses для символов, указав только такой цвет, как COLOR_PAIR(SOME_PAIR)
, я получаю два символа цвета. Используя ' ' | COLOR_PAIR(SOME_PAIR)
, то есть операцию ИЛИ с символом, я получаю только один, как я и ожидал.
Попробуйте сами (сборка с -lncurses
):
#include <ncurses.h>
#define RED 1
int main(void)
{
initscr();
start_color();
curs_set(0);
init_pair(RED, COLOR_RED, COLOR_RED);
printw("Multiple: ");
addch(COLOR_PAIR(RED));
printw("\t\tSingle: ");
addch(' ' | COLOR_PAIR(RED));
getch();
endwin();
}
Что там происходит? Как addch
Когда-либо может управлять более чем одним символом?
chtype
содержит символьные и атрибутные данные. Устанавливая chtype
на COLOR_PAIR(COLOR_RED)
, вы устанавливаете данные атрибутов, а не символьные данные, эффективно инициализируя символьные данные на 0
.
В наборе символов ASCII код символа 0
соответствует символу NULL, обычно используемому для завершения строк в C.
Теперь поймите, что это непечатаемый символ, и поэтому он представлен символами два в текстовом представлении: ^@
.
addch
и его друзья работают на более высоком уровне абстракции, чем простые поля, которые вы получили в своем терминале, они работают с символами, включая непечатаемые символы.
Из man curs_addch
:
If
ch
is any [non-whitespace] control character, it is drawn in^X
notation. Callingwinch
after adding a control character does not return the character itself, but instead returns the^
-representation of the control character.
Поскольку ncurses видит, что COLOR_PAIR(RED)
содержит код символа 0
, ncurses интерпретирует его как непечатаемый символ и соответственно печатает символ один в полях два.