использование (char *) в выражении switch - PullRequest
0 голосов
/ 17 октября 2011

Я новичок в языке программирования C и имею (если оператор), и мне нужно перенести его в оператор switch.Моя проблема в том, что у меня есть поле с именем (node_kind) типа char *, и я сравниваю его содержимое в операторе if, используя (strcmp), но я не знаю, как это сделать в операторе switch.Не могли бы вы сказать мне, как?Вот краткая цитата из моей программы

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; 

Ответы [ 3 ]

4 голосов
/ 17 октября 2011

В C вы можете использовать целочисленные литеральные константы только в метках регистра.

Для примера кода, приведенного выше, вам следует подумать об использовании подхода, «управляемого данными», а не о жестком кодировании всего этого в логике программы.

3 голосов
/ 17 октября 2011

Вы не можете использовать оператор switch для этого.

Но вы можете несколько ускорить выполнение своего кода, используя "else if" вместо "if" для второго и третьего условных выражений.

2 голосов
/ 17 октября 2011

Вы можете использовать gperf ( website ) для генерации идеального хэша, который превращает строки в целые числа. У вас будет что-то вроде этого:

В вашем заголовочном файле:

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

В вашем файле gperf:

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

В вашем выражении переключения:

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