代码之家  ›  专栏  ›  技术社区  ›  s_b

显示枚举值名称的常规方法

c c++
  •  7
  • s_b  · 技术社区  · 15 年前

    假设我们有:

    enum fuits{
        APPLE,
        MANGO,
        ORANGE,
    };
    
    main(){
    enum fruits xFruit = MANGO;
    ...
    printf("%s",_PRINT_ENUM_STRING(xFruit));
    ...
    }
    

    #define _PRINT_ENUM_STRING(x) #x
    

    在C/C++中这是可能的吗?

    4 回复  |  直到 15 年前
        1
  •  7
  •   schot    15 年前

    X-Macros :

    /* fruits.def */
    X(APPLE)
    X(MANGO)
    X(ORANGE)
    
    /* file.c */
    enum fruits {
    #define X(a) a,
    #include "fruits.def"
    #undef X
    };
    
    const char *fruit_name[] = {
    #define X(a) #a,
    #include "fruits.def"
    #undef X
    };
    

    注意,最后一个条目包含一个尾随逗号,这在C99中是允许的(但在C89中不允许)。如果这是一个问题,您可以添加sentinal值。通过为自定义名称或枚举值等提供多个参数,也可以使宏更复杂:

    X(APPLE, Apple, 2)
    #define X(a,b,c) a = c,        /* in enum */
    #define X(a,b,c) [c] = #b,     /* in name array */
    

    限制:不能有负常量,数组是空的 sizeof (char *) * largest_constant . 但您可以通过使用额外的查找表来解决这两个问题:

    int map[] = {
    #define X(a,b,c) c,
    #include "fruits.def"
    #undef X
    };
    

    enum 常量作为名称的键:

    enum fruits {
    #define X(a,b,c) a ## _KEY,
    #include "fruits.def"
    #undef X
    #define X(a,b,c) a = c,
    #include "fruits.def"
    #undef X
    };
    

    现在你可以找到 X(PINEAPPLE, Pineapple, -40) fruit_name[PINEAPPLE_KEY] .

    #define . 这可能更适合于小列表:

    #define FRUIT_LIST X(APPLE) X(ORANGE)
    

    更换 #include "fruits.def 具有 FRUIT_LIST

        2
  •  1
  •   Community Mohan Dere    8 年前

    在这种情况下,可以使用映射。

    char *a[10] = { "APPLE","MANGO","ORANGE"};
    
    printf("%s",a[xFruit]);
    

    是的,除非您提供准确的枚举值,否则预处理器将无法工作。

    同时检查 this question 了解更多信息。

        3
  •  0
  •   Matthieu M.    15 年前

    DEFINE_ENUM(Fruits, (Apple)(Mango)(Orange));
    

    它不仅仅是打印名字,如果需要的话,它还可以简化为两个开关。

    它是基于Boost.Preprocessor 设施(尤其是 BOOST_PP_SEQ_FOREACH )它是预处理器编程的必备工具,我发现它比 X

        4
  •  -1
  •   Avi Kumar Goud    13 年前

     public enum LDGoalProgressUpdateState
        {
    
    
        [Description("Yet To Start")]
        YetToStart = 1,
        [Description("In Progress")]
        InProgress = 2,
        [Description("Completed")]
        Completed = 3
    }
    
    
        var values = (ENUMList[])Enum.GetValues(typeof(ENUMList));
        var query = from name in values
                    select new EnumData//EnumData is a Modal or Entity
                    {
                        ID = (short)name,
                        Name = GetEnumDescription(name)//Description of Particular Enum Name
                    };
        return query.ToList();
    

    region HelperMethods

    public static string GetEnumDescription(Enum value) { FieldInfo fi = value.GetType().GetField(value.ToString()); DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); if (attributes != null && attributes.Length > 0) return attributes[0].Description; else return value.ToString(); } #endregion