找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1113|回复: 8
收起左侧

这段C语言宏定义代码是什么意思?

[复制链接]
ID:700956 发表于 2023-10-25 08:38 | 显示全部楼层 |阅读模式
这段代码怎么理解,宏定义不是代表一个变量吗,像这样#define MAXTIME 1000,怎么还能代表多个?
  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. };
复制代码


回复

使用道具 举报

ID:1093026 发表于 2023-10-25 08:52 | 显示全部楼层
替换进去,就是一个二维数组
回复

使用道具 举报

ID:883242 发表于 2023-10-25 11:25 | 显示全部楼层
这四个就是二维数组task_bt_ad_table的初值。
回复

使用道具 举报

ID:628113 发表于 2023-10-25 17:25 | 显示全部楼层
楼主 低估宏定义了。  宏定义可以代替 几乎  所有东西 ,除了不含分割/运算符的特殊情况。

宏定义的含义是, 在编译时 , 用 宏 替换掉 源程序。
所以 宏不但可以是变量, 也可以是 函数,甚至是整个程序的一部分代码。几乎可以是任何东西。

不好用的情况是没有分割运算符, 例如:
#define MM  "Matix"
函数 int  GetMatix();    不能替换为 int GetMM() ;
回复

使用道具 举报

ID:1094811 发表于 2023-10-25 22:36 来自手机 | 显示全部楼层
宏定义是编译器最开始编译的,编译器做的事很简单,直接文本替换
回复

使用道具 举报

ID:883242 发表于 2023-10-25 23:28 | 显示全部楼层
ppcbug 发表于 2023-10-25 17:25
楼主 低估宏定义了。  宏定义可以代替 几乎  所有东西 ,除了不含分割/运算符的特殊情况。

宏定义的含义 ...

可以用##连接符。
回复

使用道具 举报

ID:108361 发表于 2023-10-26 14:37 | 显示全部楼层
宏只是文本替换,本质上就是替换编辑器里的字符
回复

使用道具 举报

ID:108361 发表于 2023-10-26 14:38 | 显示全部楼层
只不过宏有一些操作符,比纯粹的手写字符多了一点功能,不如##连接符号,我记得contiki这个协程操作系统就是巧妙利用宏的操作符,将一个巨大的switchcase伪装成了一个多任务系统的样式
回复

使用道具 举报

ID:401564 发表于 2023-10-26 22:07 | 显示全部楼层
宏定义就是文本替换
可以对一个文本进行多个定义,方便代码编写
比如,控制端口低电平开启PNP三极管可以这样定义
#define ON 0
#define OFF 1
LED = ON;要比 LED = 0;更好理解
如果程序中还有其它是要高电平开启的,就可以这样定义
#define HI 1
#define LOW 0
这样程序理起来就不会一下子0开,一下子1开.....思维不会过于别扭
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表