2011-06-10 41 views
1

Extending這個問題,我想用我的enumed VAL爲他們「應該」是,這是否低效?

#include <stdio.h> 
enum E{ A, B, C } ; 

#define inc(enVal) (*((int*)&enVal))++ 

int main() 
{ 
    E t = A ; 
    inc(t) ; 
    printf("t %d\n", t) ; 
} 

現在呃,t是enum'd E型的變量,我有一個宏inc這增加了t的值1,

那麼這個宏(可能是其他的宏像它的標誌檢查)會比僅僅使用int t代替效率低得多?

+14

與其說是「低效率」爲「錯誤」。 – 2011-06-10 18:28:53

+0

如果你想增加它,爲什麼不使用int?另外,看到反彙編,看看究竟發生了什麼:) – Andrei 2011-06-10 18:31:24

+0

這是甚至定義的行爲? – 2011-06-10 18:31:37

回答

11

不,這不會是效率較低。然而,它會令人難以置信,可怕,錯誤。請永遠不要。

哦,尤其是枚舉的支持類型是不確定的,他們很可能實際上被編譯成小於在某些編譯器的int的大小。

0

我敢肯定這違反了標準中的嚴格別名規則,而且不僅僅是它根本不適用於C。你真的想做什麼?它實際上是否使SENSE增加值?

說你想實現的狀態機,更好的是隻是有一個vector /陣列查找表,並用它來移動到一個新的狀態。

你確定你不應該僅僅使用int相反,如果你想成爲能夠承擔所列舉值是連續?

5

來吧,沒關係超載對枚舉:

E& operator ++ (E& x) 
{ 
    x = E((int)x + 1); 
    return x; 
} 

in action

+0

這不是他在做的。 – 2011-06-10 18:40:38

+1

@尼爾:爲什麼不呢?除了他的版本在增量之前返回一個int類型並且在增量之後返回正確類型之外呢? – ybungalobill 2011-06-10 18:41:59

+0

@nbt這是他應* *一直在做,而不是*僞造宏*什麼。 – Quuxplusone 2013-10-11 17:22:07