1. 程式人生 > >switch case後接列舉(用於判斷字串常量)

switch case後接列舉(用於判斷字串常量)

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;
}