Re: [问题] 列举型别enum

楼主: Lipraxde (Lipraxde)   2017-09-01 00:30:31
原文恕删,相信您已经知道enum里面定的东西可以用作mask,那enum里面的识别字的确是
可以自己定,但是像这种特殊暂存器它每个bit都可能有自己的用途自己乱改的后果就是
,你就没办法好好用囉~除非你是做SOC可以让硬件配合你。
我觉得这种硬件相关的东西单纯看header file是不太能有深刻了解的,不如看程式范例
、看spec来的实际。
我主要想回的是这个推文
: 推 james732: 其实我不太懂这里为什么要用enum 08/31
13:2
: → james732: 用#define或const应该也都可以 08/31
13:2
的确,用#define或const是可以达到用enum差不多的效果,就我以前写PIC、CC254X经验
呢,使用enum话compiler会在你想要用以隐式转型的时候给你警告,我想这是因为单芯片
一些暂存器的值不能让你随便操作的关系。
我以前在写8051的时候大多数时候是看到用#define的做法,在写PIC的时候比较常看到用
enum的方法,写ARM的时候看到用const的方法。这个内存暂的大小其实是看你暂存器的
宣告,好像通常是宣告成unsigned char或是用struct放,没看过用enum去宣告的。
那至于型别检查呢,其实可以靠自己写ASSERT去check,不一定要用enum,不过我还是比
较喜欢用enum的方法,因为这样很容易看懂。
要注意的地方是,gcc编译C的程式的时候int隐式转型成enum时不会给警告,跟一些嵌入
式的compiler不一样。最后这个连结式我花了点时间写的C和C++的enum测试,里面有gcc、
MPLAB、IAR的compiler编译出来的结果比较。
https://github.com/Lipraxde/enum_test
作者: firejox (Tangent)   2017-09-01 01:51:00
http://tinyurl.com/y6uybrt7 enum 除了type被限制在int外 其实还不错的
作者: CoNsTaR ((const *))   2017-09-01 02:01:00
enum 可以不只是 int 啊…
作者: firejox (Tangent)   2017-09-01 02:31:00
C的enum 不是只能是int吗?
作者: CoNsTaR ((const *))   2017-09-01 05:41:00
喔喔,是 c++11 之后才可以啦 抱歉
作者: boss0405 (boss)   2017-09-01 09:18:00
enum没有规定type吧,就看compiler怎么作
作者: PkmX (阿猫)   2017-09-01 10:09:00
无:type指定的话 标准规定是不能大于int 除非大到int塞不下
作者: TWkobe (中华柯比)   2017-09-01 10:12:00
想请教一下如果大到int塞不下,是会截掉超出部分还是会分配更大得空间?
作者: xvid (DivX)   2017-09-01 10:49:00
emun type 要去看 compiler ref 每家不同
作者: james732 (好人超)   2017-09-01 12:22:00
gcc可以设定enum占的大小吗?我的MCU上的enum直接吃32bit有点太奢侈QQ
作者: descent (“雄辩是银,沉默是金”)   2017-09-01 13:45:00
c11 N1570 6.7.2.2 enum 是 int
作者: PkmX (阿猫)   2017-09-01 15:36:00
楼上他只是说enum常数必须要是int可表示而已所以不能写 enum foo { bar = (long long) INT_MAX + 1 };实际上用的 type 是 6.7.2.2.4 implementation-definedjames: 加__attribute__((packed))或是下-fshort-enums刚刚测sizeof(enum __attribute__((packed) {foo}) == 1)) 少一个括号
作者: descent (“雄辩是银,沉默是金”)   2017-09-01 17:38:00
感谢指出错误的地方。
作者: firejox (Tangent)   2017-09-01 18:08:00
原来如此 学到了@@
作者: james732 (好人超)   2017-09-01 22:52:00
我们MCU的RAM超少的Q_Q 感谢PkmX与原PO的回答!!

Links booklink

Contact Us: admin [ a t ] ucptt.com