использование (char*) в инструкции switch

#c #switch-statement #strcmp

#c #инструкция switch #стркмп #strcmp

Вопрос:

Я новичок в языке программирования C и у меня есть (оператор if), и мне нужно перенести его в инструкцию 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; 
  

Комментарии:

1. Если это домашняя работа, я бы посмотрел на дополнения. Если нет, следуйте ответу Пола Р. и найдите способ не жестко кодировать это.

Ответ №1:

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

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

Ответ №2:

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

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

Комментарии:

1. Почему это должно выполняться быстрее?

2. Потому что в коде операционной системы, если первое утверждение if окажется истинным, он продолжит и выполнит strcmps для всех других случаев, которые, как мы уже знаем, будут ложными. Если иначе это приведет к короткому замыканию.

Ответ №3:

Вы можете использовать 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: ...
...
}