#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: ...
...
}