活用宏定義

今天在看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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章