【问题标题】:Alternative to #define for flexibility in C#define 的替代方案以提高 C 语言的灵活性
【发布时间】:2012-02-01 18:10:49
【问题描述】:

我怎样才能构造一些 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

那么如何 我可以构造一些东西,这样每次我想在中间添加一些东西时,我 不必返回并手动更改每个项目的定义值?

【问题讨论】:

    标签: c function c-preprocessor


    【解决方案1】:

    您正在寻找enum

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

    要添加另一个元素,只需添加它:

    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);
    }
    

    【讨论】:

    • 所以 FIRST_ONE 将等于 0 (CREAM)?这是有道理的。
    • @perreal:在 gcc 中确实如此,但我不确定这是已定义的行为。
    • 为了最大限度的骇客,#define iterenum(name, ...) enum name { __VA_ARGS__, name##_LAST, name##_FIRST = 0 }
    • @Dave。谢谢你......伟大的时间/节能。枚举对我来说是新的(我是英语专业的,他们从来没有在我的文艺复兴诗歌课上讲过这个)。
    • @user994179 他定义了一个宏,为您插入第一个和最后一个元素;所以iterenum(FOO, BAR, BAZ, QUUX); 变成了enum FOO { BAR, BAZ, QUUX, FOO_LAST, FOO_FIRST=0};
    【解决方案2】:

    查看枚举: http://crasseux.com/books/ctutorial/enum.html

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      相关资源
      最近更新 更多