2012-02-01 31 views
2

我怎樣組織一些Ç代碼,這樣我就不必費力回去 重新定義(即#define)的事情,當我需要在添加新項中間。 下面是一個代碼示例(在真正的代碼,大約有200個不同的 定義):替代#定義靈活使用C

#define CREAM 1 
#define SALT 2 
#define BUTTER 3 
#define SUGAR 4 
#define FAT  5 

void healthyDiet() 
{ 
    int length = 10; 
    int menu[500]; 
    void consume(int, int); 

    // ****** these must be called in the following order only 
    consume(menu[ CREAM ], length); 
    consume(menu[ SALT ], length); 
    consume(menu[ BUTTER ], length); 
    consume(menu[ SUGAR ], length); 
    consume(menu[ FAT ], length); 
} 

但現在我需要#define並添加LARD,這將是簡單的,如果這裏的序列 並不重要。但LARD必須在SUGAR之前和BUTTER之後。所以 我現在需要編輯的定義:

#define CREAM 1 
#define SALT  2 
#define BUTTER 3 
#define LARD 4 
#define SUGAR 5 // changed from 4 
#define FAT  6 // changed from 5 

所以 哪能構建東西,所以,我想在中間添加的東西每一次,我 沒有回去手動更改定義每個項目的價值?

回答

5

您正在尋找enum

enum {CREAM, SALT, BUTTER, LARD, SUGAR}; 

要添加anoter元素,只是將它加入:

enum {CREAM, SALT, BUTTER, LARD, BACON, SUGAR}; 

你甚至可以使用這就像一個psudeo迭代器:

enum {FIRST_ONE, CREAM=0, SALT, BUTTER, LARD, BACON, SUGAR, LAST_ONE}; 

void healthyDiet() 
{ 
    int length = 10; 
    int menu[500]; 
    void consume(int, int); 

    int x; 
    for(x=FIRST_ONE; x<LAST_ONE; x++) 
     consume(menu[ x ], length); 
} 
+1

那麼FIRST_ONE會等於0(CREAM)?這說得通。 – perreal 2012-02-01 18:18:10

+1

@perreal:它在gcc中,但我不確定那是否定義了行爲。 – cha0site 2012-02-01 18:21:06

+3

對於最大的hackery,'#define iterenum(name,...)enum name {__VA_ARGS__,name ## _ LAST,name ## _ FIRST = 0}' – 2012-02-01 18:22:17