2011-05-03 193 views
2

有沒有辦法在C中創建多個枚舉的組合? 我想有一個共同的枚舉,將用於其他枚舉。枚舉的組合

例如,我想寫入以下代碼:

enum common_e { 
    COMMON_LITERAL_0, 
    COMMON_LITERAL_1 
} 

enum first_e { 
    common_e, // <- Somehow I would like to have the two common_e's literals here 
    FIRST_LITERAL_0, 
} 

enum another_e { 
    common_e, // <- Somehow I would like to have the two common_e's literals here 
    ANOTHER_LITERAL_0, 
    ANOTHER_LITERAL_1 
} 

我擔心的是保持共同文字在子enumarations相同的順序,因爲它們被用作ID爲函數指針陣列。

有沒有解決方案來做到這一點?

回答

4

事情是這樣的:

enum common_e { 
    COMMON_LITERAL_0, 
    COMMON_LITERAL_1, 
    COMMON_MAX 
} 

enum first_e { 
    FIRST_LITERAL_0 = COMMON_MAX, 
} 

enum another_e { 
    ANOTHER_LITERAL_0 = COMMON_MAX, 
    ANOTHER_LITERAL_1 
} 
6

enum s沒有命名空間,所以你不能有兩個同名的枚舉器。所以不,你不能這樣做,即使有預處理器或其他魔法。

如果您只是想枚舉值進行,其中一個共同的不放過,那麼怎麼樣:

enum common_e { 
    COMMON_LITERAL_0, 
    COMMON_LITERAL_1, 
    COMMON_LITERAL_END__ 
}; 

enum first_e { 
    FIRST_LITERAL_0 = COMMON_LITERAL_END__, 
    FIRST_LITERAL_1 
}; 
+0

噢!你已經知道了,我認爲這就是我需要的。謝謝 – greydet 2011-05-03 22:37:16

0

這下是不可能的你只需要定義多個枚舉。

2

好了,你可以可以想象做這樣的事:

#define COMMON_E(N) N##_COMMON_LITERAL_0, \ 
        N##_COMMON_LITERAL_1 

enum first_e { 
    COMMON_E(FIRST), // <- Somehow I would like to have the two common_e's literals here 
    FIRST_LITERAL_0, 
}; 

enum another_e { 
    COMMON_E(ANOTHER), // <- Somehow I would like to have the two common_e's literals here 
    ANOTHER_LITERAL_0, 
    ANOTHER_LITERAL_1 
}; 

雖然我不知道這樣做的好處是什麼?

問題是,枚舉不命名空間,所以你必須提供不同的名稱(因此是宏參數)。

+0

這是一個有趣的解決方案。我會在我的應用程序中考慮它,謝謝! – greydet 2011-05-03 22:31:38

0

你不能這樣做正是你問什麼,但你可以做一些事情,是幾乎一樣好。每種解決方案都依賴於設置特定枚舉成員的值的能力。

你可以把你所有的名字在一個單一的枚舉:

enum every_e { 
    // common values 
    COMMON_LITERAL_0, 
    COMMON_LITERAL_1, 
    MAX_COMMON_LITERAL = COMMON_LITERAL_1, 

    // First set of extra values 
    FIRST_LITERAL_0 = MAX_COMMON_LITERAL+1, 
    FIRST_LITERAL_1, 
    FIRST_LITERAL_2, 

    // Second set of extra values 
    ANOTHER_LITERAL_0 = MAX_COMMON_LITERAL+1, 
    ANOTHER_LITERAL_1 
}; 

如果你想使用不同的枚舉類型,你可以使用同樣的伎倆:

enum common_e { 
    COMMON_LITERAL_0, 
    COMMON_LITERAL_1, 
    MAX_COMMON_LITERAL = COMMON_LITERAL_1 
}; 

enum first_e { 
    FIRST_LITERAL_0 = MAX_COMMON_LITERAL+1, 
}; 

enum another_e { 
    ANOTHER_LITERAL_0 = MAX_COMMON_LITERAL+1, 
    ANOTHER_LITERAL_1 
}; 
+0

不要給'MAX_COMMON_LITERAL'明確的值,以防止每次添加新的'common_e'枚舉器時更新它的維護頭痛...... – 2011-05-03 22:31:46

+0

謝謝,@Oli。你是對的。但是既然你和@c微笑已經發布了,我不會去改變這個。 – 2011-05-03 22:36:13