switch case後接列舉(用於判斷字串常量)
阿新 • • 發佈:2019-02-10
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;
}
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;
}