0

我是 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; 
4

3 回答 3

4

在 C 中,您只能在 switch case 标签中使用整数文字常量。

不过,对于上面的代码示例,您应该考虑使用“数据驱动”方法,而不是将所有这些东西硬编码到程序逻辑中。

于 2011-10-17T11:36:59.757 回答
3

您不能为此使用 switch 语句。

但是您可以通过在第二个和第三个条件句中使用“else if”而不是“if”来加快代码的执行速度。

于 2011-10-17T11:35:15.993 回答
2

您可以使用 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 语句中:

switch (get_index(node->node_kind)) {
case STR_VAR_TOKEN_e: ...
...
}
于 2011-10-17T11:45:29.447 回答