以下代码的含义是什么:
//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'
有人可以解释它是如何工作的以及它们为什么以这种方式定义的?
答案 0 :(得分:4)
这些只是常数。这意味着在编译源代码之前,预处理器将遍历源代码并将#define
后面的单词的任何实例替换为右侧的字符。所以如果代码中有这样的行:
char myChar = LEFT_ARROW;
预处理器会将该代码更改为:
char myChar = 'P';
编译前。
答案 1 :(得分:4)
#define TOKEN REPLACEMENT
是preprocessor directive,它在语法上将TOKEN
的所有匹配项替换为REPLACEMENT
。
您的代码段的目的是为键盘绑定指定名称,这意味着,如果您说if (key == KB_NINE)
,编译器将会看到if (key == 'O')
。
正确使用预处理器的优点不仅在于可读性:在常量发生变化的情况下,它还可以提高可维护性。
关键定义似乎是无意义的:例如,KB_ONE
是'C'
,但是,通过在一个地方修改常量,可以通过几次击键解决这个问题。
另请参阅:http://en.wikipedia.org/wiki/C_preprocessor#Macro_definition_and_expansion
答案 2 :(得分:2)
这些是您在键盘右侧找到的按键。在C运行时中没有标准方法让程序识别这些击键。因此,已经有各种非标准的扩展来解决这个问题。
一种方案是让getch()在按下这样的扩展键时返回0,然后下一个getch()调用返回该扩展键的键码。该密钥代码可以是原始键盘扫描代码。一切皆有可能,你必须要知道原来的键盘供应商和CRT供应商有一个线索。很明显,它是古老的专有键盘接口,是新一代计算时代的优秀供应商锁定策略。