Альтернатива #define для гибкости в C - PullRequest
2 голосов
/ 01 февраля 2012

Как я могу структурировать некоторый C код, чтобы мне не пришлось кропотливо возвращаться и переопределять (то есть #define) вещи, когда мне нужно добавить новый элемент посередине. Вот пример кода (в реальном коде около 200 различных определяет):

 #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

Так как могу ли я структурировать вещи так, чтобы каждый раз, когда я хочу что-то добавить в середине, я не нужно возвращаться и вручную изменять значение для каждого элемента?

Ответы [ 2 ]

5 голосов
/ 01 февраля 2012

Вы ищете enum

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

Чтобы добавить элемент anoter, просто добавьте его:

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

Вы даже можете использовать это как псевдо-итератор:

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);
}
3 голосов
/ 01 февраля 2012

Проверьте перечисления: http://crasseux.com/books/ctutorial/enum.html

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