今天在看x86虚拟机源代码的时候,看到一个非常有意思的宏定义,记录下来说不定以后可以参考一下:
作者使用枚举类型定义各个按键的码,但不是常规的做法,而是在其中使用了宏。
在软件开发的过程中,宏因为理解不易,所以是大忌,但是因为其字符替换是在编译前期,活用宏还是可以达到一些意想不到的效果,比如用来写一些模板函数。
#include <iostream>
#define _KEYS(_) \
_(ESCAPE) _(F1) _(F2) _(F3) _(F4) _(F5) _(F6) _(F7) _(F8) _(F9) _(F10) _(F11) _(F12) \
_(GRAVE) _(1) _(2) _(3) _(4) _(5) _(6) _(7) _(8) _(9) _(0) _(MINUS) _(EQUALS) _(BACKSPACE) \
_(TAB) _(Q) _(W) _(E) _(R) _(T) _(Y) _(U) _(I) _(O) _(P) _(LEFTBRACKET) _(RIGHTBRACKET) _(BACKSLASH) \
_(CAPSLOCK) _(A) _(S) _(D) _(F) _(G) _(H) _(J) _(K) _(L) _(SEMICOLON) _(APOSTROPHE) _(RETURN) \
_(LSHIFT) _(Z) _(X) _(C) _(V) _(B) _(N) _(M) _(COMMA) _(PERIOD) _(SLASH) _(RSHIFT) \
_(LCTRL) _(APPLICATION) _(LALT) _(SPACE) _(RALT) _(RCTRL) \
_(UP) _(DOWN) _(LEFT) _(RIGHT) _(INSERT) _(DELETE) _(HOME) _(END) _(PAGEUP) _(PAGEDOWN)
#define _KEY_NAME(k) _KEY_##k,
enum {
_KEY_NONE = 0,
_KEYS(_KEY_NAME)
};
int main()
{
std::cout << std::hex << _KEY_F1 << std::endl;
std::cout << std::hex << _KEY_F2 << std::endl;
std::cout << std::hex << _KEY_F3 << std::endl;
std::cout << std::hex << _KEY_N << std::endl;
std::cout << std::hex << _KEY_M << std::endl;
std::cout << std::hex << _KEY_PAGEUP << std::endl;
return 0;
}