В чем смысл следующего кода? - PullRequest
1 голос
/ 17 декабря 2010

Что означает следующий код:

//Keyboard map
#define LEFT_ARROW      'P'
#define RIGHT_ARROW     'Q'
#define UP_ARROW        'K'
#define DOWN_ARROW      'L'
#define CANCEL          'F'
#define HOME            'A'
#define BLANK           'B'
#define SIGN_TOGGLE     'G'
#define KB_DECIMAL      'R'
#define KB_ZERO         'S'
#define KB_ONE          'C'
#define KB_TWO          'D'
#define KB_THREE        'E'
#define KB_FOUR         'H'
#define KB_FIVE         'I'
#define KB_SIX          'J'
#define KB_SEVEN        'M'
#define KB_EIGHT        'N'
#define KB_NINE         'O'
#define ENTER           'T'

Может кто-нибудь объяснить, как это работает и почему они так определены?

Ответы [ 3 ]

4 голосов
/ 17 декабря 2010

#define TOKEN REPLACEMENT является директивой препроцессора , она заменяет все вхождения TOKEN на REPLACEMENT, синтаксически.

Цель вашего фрагмента кода - присвоить имена привязкам клавиатуры, это означает, что если вы скажете if (key == KB_NINE), компилятор увидит if (key == 'O').

Преимущество правильного использования препроцессоров заключается не только в удобочитаемости: оно также повышает удобство сопровождения в случае изменения констант.

Ключевые определения кажутся бессмысленными: например, KB_ONE - это 'C', однако эту проблему можно решить несколькими нажатиями клавиш, изменив константу в одном месте.

Смотри также: http://en.wikipedia.org/wiki/C_preprocessor#Macro_definition_and_expansion

4 голосов
/ 17 декабря 2010

Это просто константы. Это означает, что препроцессор будет проходить через исходный код и заменять любой экземпляр слова, следующего за #define, символом справа перед компиляцией исходного кода. Так что если в коде была такая строка:

char myChar = LEFT_ARROW;

препроцессор изменит этот код на:

char myChar = 'P';

перед компиляцией.

2 голосов
/ 17 декабря 2010

Это те клавиши, которые вы найдете на правой стороне клавиатуры.Во время выполнения C не существует стандартного способа, позволяющего программе распознавать эти нажатия клавиш.Таким образом, для решения этой проблемы было множество видов нестандартных расширений.

Одна из схем - позволить getch () возвращать 0 при нажатии такой расширенной клавиши, следующий вызов getch () затем возвращает клавишукод для этого расширенного ключа.Этот код клавиши может быть исходным кодом сканирования клавиатуры.Все возможно, вам нужно знать оригинального поставщика клавиатуры и поставщика ЭЛТ, чтобы иметь представление.Очевидно, что древние, проприетарные интерфейсы клавиатуры были отличной стратегией блокировки поставщиков еще в эпоху неолита.

...