如何在C中将字符串转换为枚举值

时间:2012-06-01 10:47:55

标签: c c-preprocessor

我有一个文件,其中包含一些差异:

TRACE( tra_1, "AA")
TRACE( tra_1, "BB")
TRACE( tra_1, "CC")
TRACE( tra_1, "DD")
TRACE( tra_1, "EE")
..

等等。 其中AA,BB,CC,DD和EE是字符串。

我想从文件中获取这些TRACE定义并将它们转换为枚举。预处理器的输出应如下所示:

typedef enum{
AA,
BB,
CC,
DD,
EE
} TRACE;

6 个答案:

答案 0 :(得分:5)

也许你可以反过来说:有枚举并从中制作字符串吗?

 #define ENUM2STR( _e ) #_e
 TRACE( tra_1, ENUM2STR(AA) )
 ...

答案 1 :(得分:3)

不需要代码生成。 c预处理器可以为您完成。

将所有枚举值放在包含文件中。 trace_val.h:

ENUM_START(TRACE)
ENUM_VAL(tra_1, "AA")
ENUM_VAL(tra_1, "BB")
ENUM_VAL(tra_1, "CC")
ENUM_VAL(tra_1, "DD")
ENUM_VAL(tra_1, "EE")
ENUM_END(TRACE)

在另一个文件trace.h中:

#define ENUM_START(NAME) typedef enum {
#define ENUM_VAL(ID, VAL) ID,
#define ENUM_END(NAME) } NAME;
#include trace_val.h

以类似的方式,您可以重新定义ENUM_START,ENUM_VAL和ENUM_END以创建转换表:

#define ENUM_START(NAME) enum_val_t NAME##_E[] = {
#define ENUM_VAL(ID, VAL) {ID, VAL},
#define ENUM_END(NAME) {NULL, NULL}};
#include "trace_val.h"

答案 2 :(得分:0)

抱歉,我之前发错了。

查看这些帖子......这可能有所帮助 http://www.dreamincode.net/forums/topic/157186-conversion-of-string-to-enum/

答案 3 :(得分:0)

typedef enum {
        LOL, WUT, foobar, helloworld
} TRACE;

#define NNAMES 4

// MUST MATCH ENUM DEFINITION
char *TRACE_NAMES[] = {
        "LOL",
        "WUT",
        "foobar",
        "helloworld"
};

TRACE convert_str_to_TRACE( char *n ){
        int i;
        for( i=0; i<NNAMES; i++){
                if( !strcmp( TRACE_NAMES[i], n )){
                        return i;
                }
        }
        return -1; //not found
}

答案 4 :(得分:0)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//Linked List
typedef struct _node {
    char *name;
    struct _node *next;
} Node;
typedef struct _list {
    Node *data;
    struct _list *next;
} List;

Node *new_Node(char *name){
    Node *p;
    p=(Node*)malloc(sizeof(Node));
    p->name = strdup(name);
    p->next = NULL;
    return p;
}

void free_Node(Node *p){
    if(p == NULL) return;
    free(p->name);
    free_Node(p->next);
    free(p);
}

List *new_List(){
    List *p;
    p=(List*)malloc(sizeof(List));
    p->data = NULL;
    p->next = NULL;
    return p;
}

void free_List(List *p){
    if(p == NULL) return;
    free_Node(p->data);
    free_List(p->next);
    free(p);
}

Node *findNode(List *root, char *name){
    if(root->data == NULL){
        root->data = new_Node(name);
        return root->data;
    }
    if(0==strcmp(root->data->name, name)){
        return root->data;
    }
    if(root->next == NULL){
        root->next = new_List();
        root->next->data = new_Node(name);
        return root->next->data;
    }
    return findNode(root->next, name);
}

void addChildNode(Node *node, char *name){
    if(node->next == NULL){
        node->next = new_Node(name);
    } else {
        addChildNode(node->next, name);
    }
}

void addNode(List *root, char *typeName, char *idName){
    Node *np;
    np = findNode(root, typeName);
    addChildNode(np, idName);
}

void toEnumSrcOut(FILE *fo, const char *srcFile){
    FILE *fp;
    int count;
    char enumName[64]={0};
    char enumId[64]={0};
    List *root,*lp;
    Node *np;

    root = new_List();
    fp=fopen(srcFile, "r");
    while(EOF!=(count=fscanf(fp, "%[^(]%*c %*[^,]%*c %*c%[^\"]%*[^\n]%*c", enumName, enumId))){
        if(count == 2){
            addNode(root, enumName, enumId);
        }
    }
    fclose(fp);
    for(lp = root; lp != NULL ; lp=lp->next){
        fprintf(fo, "typedef enum {\n");
        for(np = lp->data->next; np != NULL ; np=np->next){
            fprintf(fo, "\t%s",np->name);
            fprintf(fo, (np->next == NULL)? "\n" : ",\n");
        }
        fprintf(fo, "} %s;\n",lp->data->name);
    }
    free_List(root);
}

int main(){
    toEnumSrcOut(stdout, "enumsrc.txt");
    return 0;
}

答案 5 :(得分:0)

您可以像这样定义预处理器函数:

#define STRINGIFY(x) #x

然后,如果你有以下枚举:

enum test {FIRST, SECOND, THIRD };

您可以使用预处理器函数将枚举转换为字符串,例如:

printf("enum string is %s\n", STRINGIFY(FIRST));