搜索
bottom↓
回复: 28

c语言这种用法俺是第一次见,弄不明白,大火帮分析下。

[复制链接]

出0入0汤圆

发表于 2010-7-31 13:26:30 | 显示全部楼层 |阅读模式
//这个函数调用的参数很奇怪
NVIC_EnableIRQ(EINT2_IRQn);

//函数定义
static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
{
  NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */
}

//参数是个枚举类型
typedef enum IRQn
{
/******  Cortex-M3 Processor Exceptions Numbers ***************************************************/
  NonMaskableInt_IRQn           = -14,      /*!< 2 Non Maskable Interrupt                         */
  MemoryManagement_IRQn         = -12,      /*!< 4 Cortex-M3 Memory Management Interrupt          */
  BusFault_IRQn                 = -11,      /*!< 5 Cortex-M3 Bus Fault Interrupt                  */
  UsageFault_IRQn               = -10,      /*!< 6 Cortex-M3 Usage Fault Interrupt                */
  SVCall_IRQn                   = -5,       /*!< 11 Cortex-M3 SV Call Interrupt                   */
  DebugMonitor_IRQn             = -4,       /*!< 12 Cortex-M3 Debug Monitor Interrupt             */
  PendSV_IRQn                   = -2,       /*!< 14 Cortex-M3 Pend SV Interrupt                   */
  SysTick_IRQn                  = -1,       /*!< 15 Cortex-M3 System Tick Interrupt               */

/******  LPC13xx Specific Interrupt Numbers *******************************************************/
  WAKEUP0_IRQn                  = 0,        /*!< All I/O pins can be used as wakeup source.       */
  WAKEUP1_IRQn                  = 1,        /*!< There are 40 pins in total for LPC17xx           */
  ......
  ......
  EINT3_IRQn                    = 53,       /*!< External Interrupt 3 Interrupt                   */
  EINT2_IRQn                    = 54,       /*!< External Interrupt 2 Interrupt                   */
  EINT1_IRQn                    = 55,       /*!< External Interrupt 1 Interrupt                   */
  EINT0_IRQn                    = 56,       /*!< External Interrupt 0 Interrupt                   */
} IRQn_Type;

没搞明白的是 EINT2_IRQn 为什么可以直接用呢?

出0入0汤圆

 楼主| 发表于 2010-7-31 13:34:58 | 显示全部楼层
原来和#define 定义有一样的效果。

出0入0汤圆

 楼主| 发表于 2010-7-31 13:36:25 | 显示全部楼层
仔细考虑一下 也没什么好奇怪的 哎

出0入0汤圆

发表于 2010-7-31 16:47:58 | 显示全部楼层
你是发帖子逗我们玩儿的吧。

出0入0汤圆

发表于 2010-7-31 22:20:43 | 显示全部楼层
LS:嘿嘿。

“日本人归头正红,南朝鲜人朴正欢和越南人阮中硬,还有什么扒勒猛干的。”

出0入0汤圆

 楼主| 发表于 2010-8-5 10:30:11 | 显示全部楼层
试了一下
#define WHITE         0x80

typedef enum COLOR
{        
    BLACK = 0x00,
    BLUE  = 0x03,
    RED   = 0xE0,
    WHITE = 0xFF
}LcdColor   ;

main里调用
delay(WHITE);

编译出错
..\User\main.c(19): error:  #40: expected an identifier

如果把define放enum后面可编译通过

typedef enum COLOR
{        
    BLACK = 0x00,
    BLUE  = 0x03,
    RED   = 0xE0,
    WHITE = 0xFF
}LcdColor   ;

#define WHITE         0x80

调用时使用数据0x80。

出0入0汤圆

发表于 2010-8-5 23:09:36 | 显示全部楼层
回复【5楼】McuY  
-----------------------------------------------------------------------

#define WHITE         0x80

typedef enum COLOR
{        
    BLACK = 0x00,
    BLUE  = 0x03,
    RED   = 0xE0,
    WHITE = 0xFF
}LcdColor   ;

main里调用
delay(WHITE);

编译出错
..\User\main.c(19): error:  #40: expected an identifier

这是因为在预编译的时候就把WHITE替换成了0x80.在编译到这样的枚举类型:
typedef enum COLOR
{        
    BLACK = 0x00,
    BLUE  = 0x03,
    RED   = 0xE0,
    0x80  = 0xFF
}LcdColor   ;
就报了上面那个错误。

出0入0汤圆

 楼主| 发表于 2010-8-6 09:51:05 | 显示全部楼层
回复【6楼】z1ibm
————————————————
为什么反过来 #define WHITE         0x80 在后面定义就能用呢?

出0入0汤圆

 楼主| 发表于 2010-8-6 09:53:44 | 显示全部楼层
这样也是将WHITE定义成两个值,为什么编译不报错呢?

出0入0汤圆

 楼主| 发表于 2010-8-6 09:54:14 | 显示全部楼层
编译器对enum 时怎么处理的?

出0入0汤圆

 楼主| 发表于 2010-8-8 10:47:30 | 显示全部楼层
定义了
typedef enum COLOR
{         
    BLACK = 0x00,
    BLUE  = 0x03,
    RED   = 0xE0,
    WHITE = 0xFF
}LcdColor   ;

再定义char WHITE 就不行了

enum其实和定义一个变量效果是一样的

出0入0汤圆

发表于 2010-8-9 18:24:08 | 显示全部楼层
回复【7楼】McuY  
回复【6楼】z1ibm
————————————————
为什么反过来 #define white         0x80 在后面定义就能用呢?
-----------------------------------------------------------------------

你可以简单理解成编译的时候分两步,1,预编译,把#include的文件包含进来,对#ifdef之类的进行判别,对#define 定义的进行替换(替换完后这个东西可以简单认为没有用了)等等
2 进行正式编译。

出0入9汤圆

发表于 2010-8-9 21:01:31 | 显示全部楼层
学习了

出0入0汤圆

发表于 2010-12-29 20:19:22 | 显示全部楼层
学习了

出0入0汤圆

发表于 2010-12-30 09:15:36 | 显示全部楼层
学习了

出0入0汤圆

发表于 2010-12-30 09:23:24 | 显示全部楼层
枚举类型本身就是个整数。
宏定义在预处理阶段被替换。

出0入0汤圆

发表于 2011-1-16 00:03:45 | 显示全部楼层
基本功有待提高

出0入0汤圆

发表于 2014-11-21 14:36:23 | 显示全部楼层
楼主摆倒了

出0入0汤圆

发表于 2014-11-21 14:46:31 | 显示全部楼层
EINT2_IRQn 在这里不就是一个枚举常量54,NVIC_EnableIRQ(EINT2_IRQn);即NVIC_EnableIRQ(54);

出0入0汤圆

发表于 2014-11-21 14:49:48 | 显示全部楼层
看看枚举类型的介绍,使用起来比较方便

出0入0汤圆

发表于 2014-11-21 15:08:02 | 显示全部楼层
在枚举的同时,还赋值,确实灵活

出0入0汤圆

发表于 2014-11-21 15:55:30 | 显示全部楼层
需要深入学习啊

出0入0汤圆

发表于 2015-4-1 17:32:01 | 显示全部楼层
这不是很常见的用法吗。

出0入0汤圆

发表于 2015-6-13 17:42:28 | 显示全部楼层
这是正常的枚举类型啊

出0入0汤圆

发表于 2016-1-25 17:37:43 | 显示全部楼层
枚举类型不是已经定义了么?可以用啊

出0入0汤圆

发表于 2016-1-25 20:43:01 | 显示全部楼层
枚举是常量,当然可以直接用。

出0入0汤圆

发表于 2017-7-5 12:40:57 | 显示全部楼层

出0入0汤圆

发表于 2017-7-11 08:31:53 | 显示全部楼层

出0入0汤圆

发表于 2017-7-26 16:13:21 来自手机 | 显示全部楼层
路过看看。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-18 21:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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