Easy way to use variables of enum types as string in C?

前端 未结 19 2471
太阳男子
太阳男子 2020-11-22 08:47

Here\'s what I am trying to do:

typedef enum { ONE, TWO, THREE } Numbers;

I am trying to write a function that would do a switch case sim

19条回答
  •  一向
    一向 (楼主)
    2020-11-22 09:15

    Check out the ideas at Mu Dynamics Research Labs - Blog Archive. I found this earlier this year - I forget the exact context where I came across it - and have adapted it into this code. We can debate the merits of adding an E at the front; it is applicable to the specific problem addressed, but not part of a general solution. I stashed this away in my 'vignettes' folder - where I keep interesting scraps of code in case I want them later. I'm embarrassed to say that I didn't keep a note of where this idea came from at the time.

    Header: paste1.h

    /*
    @(#)File:           $RCSfile: paste1.h,v $
    @(#)Version:        $Revision: 1.1 $
    @(#)Last changed:   $Date: 2008/05/17 21:38:05 $
    @(#)Purpose:        Automated Token Pasting
    */
    
    #ifndef JLSS_ID_PASTE_H
    #define JLSS_ID_PASTE_H
    
    /*
     * Common case when someone just includes this file.  In this case,
     * they just get the various E* tokens as good old enums.
     */
    #if !defined(ETYPE)
    #define ETYPE(val, desc) E##val,
    #define ETYPE_ENUM
    enum {
    #endif /* ETYPE */
    
       ETYPE(PERM,  "Operation not permitted")
       ETYPE(NOENT, "No such file or directory")
       ETYPE(SRCH,  "No such process")
       ETYPE(INTR,  "Interrupted system call")
       ETYPE(IO,    "I/O error")
       ETYPE(NXIO,  "No such device or address")
       ETYPE(2BIG,  "Arg list too long")
    
    /*
     * Close up the enum block in the common case of someone including
     * this file.
     */
    #if defined(ETYPE_ENUM)
    #undef ETYPE_ENUM
    #undef ETYPE
    ETYPE_MAX
    };
    #endif /* ETYPE_ENUM */
    
    #endif /* JLSS_ID_PASTE_H */
    

    Example source:

    /*
    @(#)File:           $RCSfile: paste1.c,v $
    @(#)Version:        $Revision: 1.2 $
    @(#)Last changed:   $Date: 2008/06/24 01:03:38 $
    @(#)Purpose:        Automated Token Pasting
    */
    
    #include "paste1.h"
    
    static const char *sys_errlist_internal[] = {
    #undef JLSS_ID_PASTE_H
    #define ETYPE(val, desc) desc,
    #include "paste1.h"
        0
    #undef ETYPE
    };
    
    static const char *xerror(int err)
    {
        if (err >= ETYPE_MAX || err <= 0)
            return "Unknown error";
        return sys_errlist_internal[err];
    }
    
    static const char*errlist_mnemonics[] = {
    #undef JLSS_ID_PASTE_H
    #define ETYPE(val, desc) [E ## val] = "E" #val,
    #include "paste1.h"
    #undef ETYPE
    };
    
    #include 
    
    int main(void)
    {
        int i;
    
        for (i = 0; i < ETYPE_MAX; i++)
        {
            printf("%d: %-6s: %s\n", i, errlist_mnemonics[i], xerror(i));
        }
        return(0);
    }
    

    Not necessarily the world's cleanest use of the C pre-processor - but it does prevent writing the material out multiple times.

提交回复
热议问题