2011-10-17 7 views
0

저는 C 프로그래밍 언어가 새로 도입되었으며 (if 문)을 가지고 있으므로 switch 문으로 전송해야합니다. 내 문제는 char * 형식의 (node_kind)라는 필드가 있고 if 문에서 (strcmp)를 사용하여 내용을 비교하지만 switch 문에서이 작업을 수행하는 방법을 모르겠습니다. 어떻게 말해 줄래? 여기 내 프로그램switch 문에서 (char *)를 사용합니다.

if (strcmp(node->node_kind, "VAR_TOKEN_e") == 0) 
    job = visitor->visitjob_VAR_TOKEN; 
if (strcmp(node->node_kind, "INT_e") == 0) 
    job = visitor->visitjob_int; 
if (strcmp(node->node_kind, "BOOL_e") == 0) 
    job = visitor->visitjob_bool; 
+2

: 스위치 문에서

struct entry; #include <string.h> #include "header.h" struct entry { char *name; int value; }; %language=ANSI-C %struct-type %% VAR_TOKEN_e, STR_VAR_TOKEN_e INT_e, STR_INT_e BOOL_e, STR_BOOL_e %% int get_index(char *str) { struct entry *e = in_word_set(str, strlen(str)); return e ? e->value : -1; } 

: 당신의 gperf의 파일에서

enum { STR_VAR_TOKEN_e, STR_INT_e, STR_BOOL_e }; int get_index(char *str); 

: 헤더 파일에서

: 당신이 뭔가를해야합니다 내가 열렬히 보았다. 폴 R.의 대답과 함께 가지 않으면 하드 코드하지 않는 방법을 찾으십시오. – asm

답변

2

gperf (website)를 사용하면 문자열을 정수로 변환하는 완벽한 해시를 생성 할 수 있습니다. (가)의 경우

switch (get_index(node->node_kind)) { 
case STR_VAR_TOKEN_e: ... 
... 
} 
3

당신은 이것에 대한 switch 문을 사용할 수 없습니다의 짧은 인용이다.

그러나 두 번째 및 세 번째 조건부에 대해 "if"대신 "else if"를 사용하여 코드 실행 속도를 다소 높일 수 있습니다.

+0

왜 이렇게 빨리 실행됩니까? –

+1

OP의 코드에서 첫 번째 if 문이 true로 밝혀지면 그는 계속 수행하고 strcmps를 수행하여 이미 알고있는 다른 모든 경우에 대해 거짓으로 표시합니다. 그렇지 않으면 그것을 단락시킬 것입니다. –

4

C에서는 스위치 문자 레이블에 정수 리터럴 상수 만 사용할 수 있습니다.

위의 코드 예제에서,이 모든 것을 프로그램 논리에 하드 코딩하지 않고 "데이터 기반"접근 방법을 사용해야한다고 생각해야합니다.

관련 문제