switch case后接枚举(用于判断字符串常量)

来源:互联网 发布:学编程怎么赚钱 编辑:程序博客网 时间:2024/05/17 02:11
c/c++ 语言不允许后面直接接字符串。
c/c++ 语言case后面只允是整型、常量或表达式,例如:
int k=3;
switch(k)
{
    case 'd'-'a':  
        printf("d-a\n");
        break;
    case 4 :       
        printf("4\n");
        break;
    case 'Z' :     
        printf("Z\n");
        break;  //单引号括起的是字符常量,是整型。
}
上面用的都是整型常量表达式,所以正确。
字符串常量,例如:双引号括起的 "Z", 虽然是常量,但它们不是整型,所以不允许。
其它语言,要看它们自己的规定。

我们可以利用结构体及枚举,使switch case可以用来判断字符串常量

typedef enum {
    oBadOption,
    oDaemon,
    oDebugLevel,
    oExternalInterface,
} OpCodes;

static const struct {
    const char *name;
    OpCodes opcode;
} keywords[] = {
    { "daemon",                 oDaemon },
    { "debuglevel",             oDebugLevel },
    { "externalinterface",      oExternalInterface },
    { NULL,                oBadOption },
};


static OpCodes config_parse_token(const char *cp)
{
    int i;

    for (i = 0; keywords[i].name; i++)
        if (strcasecmp(cp, keywords[i].name) == 0)
            return keywords[i].opcode;

    debug(LOG_ERR, "Bad configuration option is NULL");
    return oBadOption;
}

int opcode = config_parse_token("daemon");
switch(opcode)
{
    case oDaemon:
        if (config.daemon == -1 && ((value = parse_boolean_value(p1)) != -1))
        {
            config.daemon = value;
        }
            break;
    case oExternalInterface:
        config.external_interface = safe_strdup(p1);
        break;
    case oGatewayID:
        config.gw_id = safe_strdup(p1);
        break;
    case oBadOption:
        debug(LOG_ERR, "Exiting...");
        break;
}
0 0