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