我有一个文件,其中有一些定义,例如:
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;
我有一个文件,其中有一些定义,例如:
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;
也许你可以反过来:有枚举并用它们制作字符串?
#define ENUM2STR( _e ) #_e
TRACE( tra_1, ENUM2STR(AA) )
...
不需要代码生成。c 预处理器可以为您完成。
将所有枚举值放入包含文件中。跟踪_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"
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
}
#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;
}
您可以像这样定义预处理器函数:
#define STRINGIFY(x) #x
然后,如果您有以下枚举:
enum test {FIRST, SECOND, THIRD }
;
您可以使用预处理器函数将枚举转换为字符串,例如:
printf("enum string is %s\n", STRINGIFY(FIRST));
抱歉我之前发错了。
看看这篇文章......它可以帮助 http://www.dreamincode.net/forums/topic/157186-conversion-of-string-to-enum/