找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1903|回復(fù): 8
收起左側(cè)

這段C語言宏定義代碼是什么意思?

[復(fù)制鏈接]
ID:700956 發(fā)表于 2023-10-25 08:38 | 顯示全部樓層 |閱讀模式
這段代碼怎么理解,宏定義不是代表一個(gè)變量嗎,像這樣#define MAXTIME 1000,怎么還能代表多個(gè)?
  1. /*******************************************************************
  2.                             AD按鍵表
  3. *******************************************************************/
  4. #define ADKEY_BT_SHORT                \
  5.                         /*00*/    NO_MSG,\
  6.                         /*01*/    NO_MSG,\
  7.                         /*02*/    MSG_BT_CALL_REJECT,\
  8.                         /*03*/    MSG_BT_CALL_HANGUP,\
  9.                         /*04*/    MSG_BT_CALL_LAST_NO,\
  10.                         /*05*/    MSG_EQ_MODE,\
  11.                         /*06*/    MSG_CHANGE_WORKMODE,\
  12.                         /*07*/    MSG_BT_PREV_FILE,\
  13.                         /*08*/    MSG_BT_NEXT_FILE,\
  14.                         /*09*/    MSG_BT_PP,


  15. #define ADKEY_BT_LONG                \
  16.                         /*00*/    NO_MSG,\
  17.                         /*01*/    NO_MSG,\
  18.                         /*02*/    NO_MSG,\
  19.                         /*03*/    NO_MSG,\
  20.                         /*04*/    NO_MSG,\
  21.                         /*05*/    NO_MSG,\
  22.                         /*06*/    NO_MSG,\
  23.                         /*07*/    MSG_VOL_DOWN,\
  24.                         /*08*/    MSG_VOL_UP,\
  25.                         /*09*/    MSG_POWER_OFF,

  26. #define ADKEY_BT_HOLD                \
  27.                         /*00*/    NO_MSG,\
  28.                         /*01*/    NO_MSG,\
  29.                         /*02*/    NO_MSG,\
  30.                         /*03*/    NO_MSG,\
  31.                         /*04*/    NO_MSG,\
  32.                         /*05*/    NO_MSG,\
  33.                         /*06*/    NO_MSG,\
  34.                         /*07*/    MSG_VOL_DOWN,\
  35.                         /*08*/    MSG_VOL_UP,\
  36.                         /*09*/    MSG_POWER_OFF_HOLD,

  37. #define ADKEY_BT_LONG_UP        \
  38.                         /*00*/    NO_MSG,\
  39.                         /*01*/    NO_MSG,\
  40.                         /*02*/    NO_MSG,\
  41.                         /*03*/    NO_MSG,\
  42.                         /*04*/    NO_MSG,\
  43.                         /*05*/    NO_MSG,\
  44.                         /*06*/    NO_MSG,\
  45.                         /*07*/    MSG_VOL_KEY_UP,\
  46.                         /*08*/    MSG_VOL_KEY_UP,\
  47.                         /*09*/    MSG_POWER_KEY_UP,


  48. const u16 task_bt_ad_table[4][KEY_REG_AD_MAX] = {
  49.     /*短按*/            {ADKEY_BT_SHORT},
  50.     /*長按*/                {ADKEY_BT_LONG},
  51.     /*連按*/                {ADKEY_BT_HOLD},
  52.     /*長按抬起*/        {ADKEY_BT_LONG_UP},
  53. };
復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

ID:1093026 發(fā)表于 2023-10-25 08:52 | 顯示全部樓層
替換進(jìn)去,就是一個(gè)二維數(shù)組
回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2023-10-25 11:25 | 顯示全部樓層
這四個(gè)就是二維數(shù)組task_bt_ad_table的初值。
回復(fù)

使用道具 舉報(bào)

ID:628113 發(fā)表于 2023-10-25 17:25 | 顯示全部樓層
樓主 低估宏定義了。  宏定義可以代替 幾乎  所有東西 ,除了不含分割/運(yùn)算符的特殊情況。

宏定義的含義是, 在編譯時(shí) , 用 宏 替換掉 源程序。
所以 宏不但可以是變量, 也可以是 函數(shù),甚至是整個(gè)程序的一部分代碼。幾乎可以是任何東西。

不好用的情況是沒有分割運(yùn)算符, 例如:
#define MM  "Matix"
函數(shù) int  GetMatix();    不能替換為 int GetMM() ;
回復(fù)

使用道具 舉報(bào)

ID:1094811 發(fā)表于 2023-10-25 22:36 來自手機(jī) | 顯示全部樓層
宏定義是編譯器最開始編譯的,編譯器做的事很簡單,直接文本替換
回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2023-10-25 23:28 | 顯示全部樓層
ppcbug 發(fā)表于 2023-10-25 17:25
樓主 低估宏定義了。  宏定義可以代替 幾乎  所有東西 ,除了不含分割/運(yùn)算符的特殊情況。

宏定義的含義 ...

可以用##連接符。
回復(fù)

使用道具 舉報(bào)

ID:108361 發(fā)表于 2023-10-26 14:37 | 顯示全部樓層
宏只是文本替換,本質(zhì)上就是替換編輯器里的字符
回復(fù)

使用道具 舉報(bào)

ID:108361 發(fā)表于 2023-10-26 14:38 | 顯示全部樓層
只不過宏有一些操作符,比純粹的手寫字符多了一點(diǎn)功能,不如##連接符號(hào),我記得contiki這個(gè)協(xié)程操作系統(tǒng)就是巧妙利用宏的操作符,將一個(gè)巨大的switchcase偽裝成了一個(gè)多任務(wù)系統(tǒng)的樣式
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2023-10-26 22:07 | 顯示全部樓層
宏定義就是文本替換
可以對(duì)一個(gè)文本進(jìn)行多個(gè)定義,方便代碼編寫
比如,控制端口低電平開啟PNP三極管可以這樣定義
#define ON 0
#define OFF 1
LED = ON;要比 LED = 0;更好理解
如果程序中還有其它是要高電平開啟的,就可以這樣定義
#define HI 1
#define LOW 0
這樣程序理起來就不會(huì)一下子0開,一下子1開.....思維不會(huì)過于別扭
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表