-1

私は次のようないくつかの定義を持つファイルを持っています:

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;
4

6 に答える 6

5

おそらく、逆の方法で作成できます。列挙型を使用して、それらから文字列を作成しますか?

 #define ENUM2STR( _e ) #_e
 TRACE( tra_1, ENUM2STR(AA) )
 ...
于 2012-06-01T11:11:40.557 に答える
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"
于 2012-06-01T14:30:44.993 に答える
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
}
于 2012-06-01T11:04:01.463 に答える
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;
}
于 2012-06-01T14:58:23.443 に答える
0

申し訳ありませんが、以前に間違って投稿しました。

この投稿をチェックしてください... http://www.dreamincode.net/forums/topic/157186-conversion-of-string-to-enum/

于 2012-06-01T10:56:04.283 に答える
0

次のようなプリプロセッサ関数を定義できます。

#define STRINGIFY(x) #x

次に、次の列挙型がある場合:

enum test {FIRST, SECOND, THIRD };

プリプロセッサ関数を使用して、列挙型を文字列に変換できます。次に例を示します。

printf("enum string is %s\n", STRINGIFY(FIRST));
于 2012-06-01T15:26:07.453 に答える