1. 程式人生 > >enum定義時typedef的前與後

enum定義時typedef的前與後

enum型別通常會與typedef關鍵字一起用,方便使用.

有兩種寫法,

第一種是typedef在enum前邊,如:

typedefenum {

    UIViewAnimationCurveEaseInOut,         // slow at beginning and end

    UIViewAnimationCurveEaseIn,            // slow at beginning

    UIViewAnimationCurveEaseOut,           // slow at end

    UIViewAnimationCurveLinear

} UIViewAnimationCurve;

第二種寫法是在enum後邊, 這樣寫往往是存在<<運算子(嚴格來說已經不是一個語句了,而是兩個,但這兩個語句是一個整體,缺一不可):

enum {

DDLogMessageCopyFile     = 1 << 0,
DDLogMessageCopyFunction = 1 << 1,
};
typedef int DDLogMessageOptions;

兩者有何區別呢?先看DDLogMessageOptions定義體, <<是左移運算,定義這樣一些值通常是為了使這些值除了離散的options之外還有"|"運算的目的,從而組成更多的options,也就是options不僅限定義體中的那幾個.

這時如果用如下定義,

typedef enum {

DDLogMessageCopyFile     = 1 << 0,
DDLogMessageCopyFunction = 1 << 1,
} DDLogMessageOptions;

那麼

DDLogMessageOptions op = DDLogMessageCopyFile | DDLogMessageCopyFunction 將編譯不過(VS會報錯,Xcode卻不報語法錯誤,看來Xcode標準遵循得不是很好), 也許有人說強制轉型, 但不轉型顯然更合邏輯與簡練.