2012-06-01 189 views
-1

有具有一定difinitions像一个文件:我如何将字符串转换为枚举值用C

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; 
+0

这不是一个约C编程的问题,这是一个关于根据图案操纵源代码的文本问题。 – unwind

+0

你可以使用Perl或Python来解析输入文件并生成所需的'enum'声明。的 – gavinb

+0

可能重复[简易的方式来使用枚举类型的变量作为C字符串?](http://stackoverflow.com/questions/147267/easy-way-to-use-variables-of-enum-types-as-字符串在-C) – Suma

回答

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 
} 
5

也许你可以把它倒过来:有枚举,并从他们做出字符串?

#define ENUM2STR(_e) #_e 
TRACE(tra_1, ENUM2STR(AA)) 
... 
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" 
+0

我试过你的解决方案,但它编译时与gcc编译问题。我有一个文件(让我说my_file。ti),其定义如TRACE(tra_1,“AA”) TRACE(tra_2,“BB”) TRACE(tra_3,“CC”) TRACE(tra_4,“DD”) TRACE(tra_5,“EE”) 。我想包含my_file.ti并将这些字符串(TRACE中的第二个参数)转换为枚举值。 – user1430471

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

你可以定义一个预处理功能是这样的:

#define STRINGIFY(x) #x 

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

enum test {FIRST, SECOND, THIRD };

可以使用预处理器功能的枚举转换为字符串,例如:

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