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 为什么可以直接用呢? 原来和#define 定义有一样的效果。 仔细考虑一下 也没什么好奇怪的 哎 你是发帖子逗我们玩儿的吧。 LS:嘿嘿。
“日本人归头正红,南朝鲜人朴正欢和越南人阮中硬,还有什么扒勒猛干的。” 试了一下
#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。 回复【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 ;
就报了上面那个错误。 回复【6楼】z1ibm
————————————————
为什么反过来 #define WHITE 0x80 在后面定义就能用呢? 这样也是将WHITE定义成两个值,为什么编译不报错呢? 编译器对enum 时怎么处理的? 定义了
typedef enum COLOR
{
BLACK = 0x00,
BLUE= 0x03,
RED = 0xE0,
WHITE = 0xFF
}LcdColor ;
再定义char WHITE 就不行了
enum其实和定义一个变量效果是一样的 回复【7楼】McuY
回复【6楼】z1ibm
————————————————
为什么反过来 #define white 0x80 在后面定义就能用呢?
-----------------------------------------------------------------------
你可以简单理解成编译的时候分两步,1,预编译,把#include的文件包含进来,对#ifdef之类的进行判别,对#define 定义的进行替换(替换完后这个东西可以简单认为没有用了)等等
2 进行正式编译。 学习了 学习了 学习了 枚举类型本身就是个整数。
宏定义在预处理阶段被替换。 基本功有待提高 楼主摆倒了 EINT2_IRQn 在这里不就是一个枚举常量54,NVIC_EnableIRQ(EINT2_IRQn);即NVIC_EnableIRQ(54); 看看枚举类型的介绍,使用起来比较方便 在枚举的同时,还赋值,确实灵活 需要深入学习啊 这不是很常见的用法吗。 这是正常的枚举类型啊 枚举类型不是已经定义了么?可以用啊 枚举是常量,当然可以直接用。 {:titter:}{:titter:}{:titter:}{:titter:}{:titter:} {:lol:}{:lol:} 路过看看。
页:
[1]