0

私は C プログラミング言語が初めてで、(if ステートメント) があり、それを switch ステートメントに転送する必要があります。私の問題は、char* タイプの (node_kind) という名前のフィールドがあり、(strcmp) を使用して if ステートメントでその内容を比較することですが、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では、スイッチケースラベルでのみ整数リテラル定数を使用できます。

ただし、上記のコード例では、これらすべてをプログラムロジックにハードコーディングするのではなく、「データ駆動型」アプローチの使用を検討する必要があります。

于 2011-10-17T11:36:59.757 に答える
3

これにswitchステートメントを使用することはできません。

ただし、2番目と3番目の条件に「if」の代わりに「elseif」を使用することで、コードの実行をいくらか高速化できます。

于 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 (get_index(node->node_kind)) {
case STR_VAR_TOKEN_e: ...
...
}
于 2011-10-17T11:45:29.447 に答える