干货 | 枚举变量与宏的应用

想必会C的网友对枚举和宏的定义与使用并不陌生,对于枚举和宏的区别大家应该都很熟悉。

枚举类型用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。

宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串)

在很多情况下,我们为了代码整洁,并与使用,总喜欢把多个宏定义成一个枚举变量。在代码中使用来说一般是不会出现问题的,因为他们都是常亮。但要特别注意一个问题,宏只是简单的替换,不存在与否和存储空间的问题;而枚举则是变量,是变量就会使用存储空间、且要满足变量的语法问题。

下面以一个例子来说明枚举和宏不能混用的地方:

1.定义一组枚举变量

typedef enum
{
   PWM_ALT_1 = 0x00,                                                            // 
   PWM_ALT_2 = 0x01,                                                            //    
} PWM_ALT;

2. 定义一个宏,宏的初始化值为枚举变量中的一个值

#define PWM_ALT_SLC      (PWM_ALT_1)                                           //

3. 使用这个宏进行条件编译

#if (PWM_ALT_SLC == PWM_ALT_1)
    GPIOInit(GPIO0, GPIO_PIN_2, GPIO_MOD_T1_P0);                       (1)
#else
    GPIOInit(GPIO1, GPIO_PIN_2, GPIO_MOD_T1_P0A);                      (2)
#endif

4. 编译运行,你会发现不管PWM_ALT_SLC取值为PWM_ALT_1还是PWM_ALT_2,编译的代码都为第(1)组,而不能得到第(2)组.这显然和我们想要的结果是不同的,为什么会这样呢?

分析:从上面的问题可以看出PWM_ALT_SLC的值为PWM_ALT_1还是PWM_ALT_2,实际上都没有发生改变,都为0.如果您不信可以直接让PWM_ALT_SLC的值为0x00或0x01,可以发现,这时候就可以正常工作了。

解决:为了获取我们想要的结果,正确的操作应该是把枚举变量用宏来代替

#define PWM_ALT_1        (0x00)                                      // 
#define PWM_ALT_2        (0x01)                                      //  
#define PWM_ALT_SLC      (PWM_ALT_2)                                 // 选择备用引脚

总结:枚举虽然说是常亮,但在编译之前编译并没有为其分配空间,也没有为其赋值。所以,默认枚举组里边的数据都为0。只有代码编译完成后,编译器才会为枚举变量分配空间和赋值。

(0)

相关推荐

  • 嵌入式C语言中宏的使用技巧

    在整个嵌入式C语言系列中,我一直都是用嵌入式去限定C语言,而不是针对整个C语言,因为我们这里主要讨论的是嵌入式中的C语言.<C语言程序设计>这门课,大家基本上都在大学课程里学过或者有所了解 ...

  • C语言学习篇(9)位操作(三)

    https://m.toutiao.com/is/Jben8H9/ 在很多开源项目中都会使用宏定义的方式实现一些特定的位运算,以及在一些面试过程中,都会涉及分析其工作原理,因此这节来拓展下宏定义实现位 ...

  • 长文花了两天时间整理了STM32中的一些C语言知识点

    https://m.toutiao.com/is/euo2NE7/ 前言 一位初学单片机的小伙伴让我推荐C语言书籍,因为C语言基础比较差,想把C语言重新学一遍,再去学单片机,我以前刚学单片机的时候也有 ...

  • 【干货·红斑狼疮】肖春宏老师

    ​[干货·红斑狼疮] 1,病因病机:肝肾阴虚是根本,热毒伏于营分是关键,经脉瘀阻是邪毒留滞之所,风湿是发病之诱因. 2,分步论治:初期风湿活动而发病,掌握了痹证,诊治疗此期不难.盛期气营两燔,治以清营 ...

  • 【治颈椎病干货】肖春宏老师

    [治颈椎病干货] 西医治脊椎病没有好办法,中医不负众望,以雄厚的技术实力治颈椎病,无坚不催! 1,西医将颈椎病分为颈型,神经根型,椎动脉型,脊髓型,交感型. 2,颈椎病属于中医痹证,病因是风寒湿三者混 ...

  • 【干货】表解里自和,里和表自解(肖春宏老师)

    ​[干货]表解里自和,里和表自解,讲此问题之目的是学会治合病,少干合好几个方子之事,结束治病机枪扫射. 1,276条,太阴病,脉浮者,可发汗,宜桂枝汤.此条文首先明确说太阴病,既然是太阴病,那么腹满, ...

  • 【干货】六经传变无一定顺序,但是有规律可循(肖春宏老师)

    ​[干货]六经传变无一定顺序,但是有规律可循, ​即:津伤从热化,阳伤从寒化. ​ ​比如,太阳病发汗不当,胃中津液伤,证从热化,则生虚烦与结胸两大变证,分别用桅子豉汤,大小陷胸汤. ​​又比如:太阳 ...

  • 《复习·治妇科病干货》肖春宏老师

    ​<复习·治妇科病干货> 妇科疾病有自己的特点,与众不同,形成独立的学科,与众不同体现在经,带,孕,胎,产,乳等方面.治疗妇科疾病主要调理肝,脾,肾三者. 一,[名词解释] 天癸:是一种具 ...

  • 【干货】《内经》曰“三阳结谓之隔”。(肖春宏老师)

    ​如何处理内伤与外感的关系?用神机气立学说.神机是人体内之气的升降系统.气立是气出入人体内外的系统.<内经>说"出入废则神机化灭,升降息则气立孤危",外感表证破坏了气立 ...

  • 【肖春宏】中医把脉辩别病情《诊脉干货》

       [诊脉干货]寸,关,尺三部脉,迟则俱迟,数则俱数,怎么确定分部主病?比如"寸迟必是上焦寒",又比如"寸数咽喉口生疮" 谁知道怎么确定寸迟,寸数? 留段思考 ...

  • 【诊脉干货】肖春宏老师

    ​[诊脉干货]寸,关,尺三部脉,迟则俱迟,数则俱数,怎么确定分部主病?比如"寸迟必是上焦寒",又比如"寸数咽喉口生疮" 谁知道怎么确定寸迟,寸数? 留段思考时间 ...

  • 【干货·紫舌】肖春宏老师

    ​[干货·紫舌]无论是淡紫舌.青紫舌,还是红紫舌,凡是舌质颜色中含"紫"色,都主瘀血.有瘀血则经络中的血液运行不畅通,供给五脏六腑的血液不足,五脏六腑功能减弱.治瘀血证主要是消除瘀 ...