McuY 发表于 2010-7-31 13:26:30

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

//这个函数调用的参数很奇怪
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 为什么可以直接用呢?

McuY 发表于 2010-7-31 13:34:58

原来和#define 定义有一样的效果。

McuY 发表于 2010-7-31 13:36:25

仔细考虑一下 也没什么好奇怪的 哎

june4th 发表于 2010-7-31 16:47:58

你是发帖子逗我们玩儿的吧。

TANK99 发表于 2010-7-31 22:20:43

LS:嘿嘿。

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

McuY 发表于 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。

z1ibm 发表于 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   ;
就报了上面那个错误。

McuY 发表于 2010-8-6 09:51:05

回复【6楼】z1ibm
————————————————
为什么反过来 #define WHITE         0x80 在后面定义就能用呢?

McuY 发表于 2010-8-6 09:53:44

这样也是将WHITE定义成两个值,为什么编译不报错呢?

McuY 发表于 2010-8-6 09:54:14

编译器对enum 时怎么处理的?

McuY 发表于 2010-8-8 10:47:30

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

再定义char WHITE 就不行了

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

CortexMx 发表于 2010-8-9 18:24:08

回复【7楼】McuY
回复【6楼】z1ibm
————————————————
为什么反过来 #define white         0x80 在后面定义就能用呢?
-----------------------------------------------------------------------

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

liangyurongde 发表于 2010-8-9 21:01:31

学习了

psjicfh 发表于 2010-12-29 20:19:22

学习了

wxx116zh 发表于 2010-12-30 09:15:36

学习了

hunter0395 发表于 2010-12-30 09:23:24

枚举类型本身就是个整数。
宏定义在预处理阶段被替换。

k0059 发表于 2011-1-16 00:03:45

基本功有待提高

majtsdd 发表于 2014-11-21 14:36:23

楼主摆倒了

Gallen.Zhang 发表于 2014-11-21 14:46:31

EINT2_IRQn 在这里不就是一个枚举常量54,NVIC_EnableIRQ(EINT2_IRQn);即NVIC_EnableIRQ(54);

albert.hu 发表于 2014-11-21 14:49:48

看看枚举类型的介绍,使用起来比较方便

xmm 发表于 2014-11-21 15:08:02

在枚举的同时,还赋值,确实灵活

liuhuancz03 发表于 2014-11-21 15:55:30

需要深入学习啊

jxn98310 发表于 2015-4-1 17:32:01

这不是很常见的用法吗。

Mrjiang 发表于 2015-6-13 17:42:28

这是正常的枚举类型啊

鹰击长空1992 发表于 2016-1-25 17:37:43

枚举类型不是已经定义了么?可以用啊

lingdianhao 发表于 2016-1-25 20:43:01

枚举是常量,当然可以直接用。

xuzhiping9889 发表于 2017-7-5 12:40:57

{:titter:}{:titter:}{:titter:}{:titter:}{:titter:}

chenaiguo0503 发表于 2017-7-11 08:31:53

{:lol:}{:lol:}

Excellence 发表于 2017-7-26 16:13:21

路过看看。
页: [1]
查看完整版本: c语言这种用法俺是第一次见,弄不明白,大火帮分析下。