以下代码是什么意思?

时间:2010-12-17 06:11:14

标签: keyboard c-preprocessor

以下代码的含义是什么:

//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 个答案:

答案 0 :(得分:4)

这些只是常数。这意味着在编译源代码之前,预处理器将遍历源代码并将#define后面的单词的任何实例替换为右侧的字符。所以如果代码中有这样的行:

char myChar = LEFT_ARROW;

预处理器会将该代码更改为:

char myChar = 'P';
编译前

答案 1 :(得分:4)

#define TOKEN REPLACEMENTpreprocessor 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供应商有一个线索。很明显,它是古老的专有键盘接口,是新一代计算时代的优秀供应商锁定策略。