C语言中灵活性定义的替代方案

C语言中灵活性定义的替代方案,c,function,c-preprocessor,C,Function,C Preprocessor,如何构造一些C代码,这样我就不必费力地返回 当我需要在中间添加一个新的项目时,重新定义(即,代码>代码定义< /代码>)。 下面是一个代码示例(在实际代码中,大约有200个不同的 定义): 但是现在我需要#定义并添加猪油,如果序列 这里并不重要。但是猪油必须在糖之前和黄油之后。所以 我现在需要编辑定义: #define CREAM 1 #define SALT 2 #define BUTTER 3 #define LARD 4 #define SUGAR 5 //

如何构造一些C代码,这样我就不必费力地返回 当我需要在中间添加一个新的项目时,重新定义(即,代码>代码定义< /代码>)。 下面是一个代码示例(在实际代码中,大约有200个不同的 定义):

但是现在我需要
#定义
并添加
猪油
,如果序列 这里并不重要。但是
猪油
必须在
之前和
黄油
之后。所以 我现在需要编辑定义:

#define CREAM    1
#define SALT     2
#define BUTTER  3
#define LARD    4
#define SUGAR   5   // changed from 4
#define FAT     6   // changed from 5
那怎么办 我可以构造事物,以便每次我想在中间添加一些东西,i 不必返回并手动更改每个项目的定义值?

签出枚举:


您正在查找
enum

enum {CREAM, SALT, BUTTER, LARD, SUGAR};
要添加其他元素,只需添加它:

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);
}
enum{FIRST_ONE,CREAM=0,盐,黄油,猪油,培根,糖,LAST_ONE};
void healthyDiet()
{
整数长度=10;
int菜单[500];
无效消耗(int,int);
int x;

对于(x=FIRST\u ONE;xSo)第一个等于0(CREAM)?这是有意义的。@perreal:在gcc中是这样的,但我不确定这是定义的行为。对于最大程度的黑客行为,
#define iterenum(name…)enum name{uu VA_ARGS,name##LAST,name###u FIRST=0}
@Dave。谢谢你……非常节省时间/精力。enum对我来说是新事物(我主修英语,他们在我的文艺复兴诗歌课上根本没有涉及到这一点)。@user994179他定义了一个宏,为你插入第一个和最后一个元素;因此
iterenum(FOO,BAR,BAZ,qux);
变成
enum FOO{BAR,BAZ,qux,FOO_last,FOO_first=0};
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);
}