C++ 如何在案例c+中使用字符串+;
我想使用C++ 如何在案例c+中使用字符串+;,c++,C++,我想使用大小写“name” 当我调用命令do_reload animenot work时do_reload是主要功能,而'anime'是大小写。如果我使用case'a'它工作得很好,但是当我使用case'anime'时,什么都没有发生。这是为什么?< p>不幸的是,你不能在C++中切换字符串。 < p>我假设你打算使用双引号“字符串字符串,因为单引号是针对代码> char < /c> > < /p> 开关需要能够从选择的整数(即可枚举)常量中选择匹配条件。字符串文字,如“anime”,可以归结为
大小写“name”
当我调用命令
do_reload anime
not work时do_reload
是主要功能,而'anime'
是大小写。如果我使用case'a'
它工作得很好,但是当我使用case'anime'
时,什么都没有发生。这是为什么?< p>不幸的是,你不能在C++中切换字符串。 < p>我假设你打算使用双引号<代码>“<代码>字符串字符串,因为单引号是针对代码> char < /c> > < /p>
开关需要能够从选择的整数(即可枚举)常量中选择匹配条件。字符串文字,如“anime”
,可以归结为保留内存中的常量字符
数组,可以将字符*
指针分配给该数组。但是比较两个字符串只有通过比较它们的内容而不是指针地址才有意义。您可能会创建一个动态字符串,其内容与字符串文字相同,但地址不同。由于这种模糊性,您不能在开关中使用字符串
您应该使用if-else梯形图或适合您需要的数据结构,如
std::map
开关中的表达式,并且大小写
值仅允许为整型
字符串文字不是整型文字
单个字符(如
'A'
)为整型。literal'anime'
(虽然没有意义)是一个多字符的literal,它也有一个整数类型。正如其他人所说,不能将文本literal与case
语句一起使用
你的选择是:
std::map
带有函数指针std::map
或lookup table的一个问题是所有函数必须具有相同的签名。C++语言不允许在C
语言也是如此。
所以答案是否定的,你不能在C++
中这样做,也不能在C
你可以对此感兴趣,因为有太多的答案说你不能,我要告诉你——你当然可以!当然有一些警告
constexpr unsigned long encode_(unsigned long in, const char* s)
{
return *s ? encode_((in << 8) | s[0], s + 1) : in;
}
constexpr unsigned long encode(const char* s)
{
return encode_(0, s);
}
constexpr unsigned long operator"" _x(const char* s, long unsigned len)
{
return encode(s);
}
int main(int argc, char **argv)
{
auto x = "hello"_x;
switch (x)
{
case "ola"_x:
break;
case "hello"_x:
break;
}
}
constexpr无符号长编码(无符号长编码,const char*s)
{
return*s?encode_((很简单,您不能使用函数指针(或函数对象),查找表或std::map
'anime'
实际上不是一件事!感谢所有人的回答。我可以这样使用它吗?如果(!strcmp(arg1,“Value X”))插入开关@πνταῥεῖ - 显然是这样-然后是C?没关系,我可以混合使用C和C++你也不能在C中对字符指针或文本文本进行切换。注意:相同签名的一些麻烦可以通过std::map
的std::function
和使用std::bind
或lambdas隐藏参数来减轻。重点是m没错。std::map
的一个变体是将字符串映射到整数或枚举值,然后使用该值生成一个switch语句。这就解决了需要具有不同签名的额外函数的问题。“我要告诉你——你当然可以!”不,你们不能。答案很好,是的,它可以工作,但你们最终使用了带整数的开关。
constexpr unsigned long encode_(unsigned long in, const char* s)
{
return *s ? encode_((in << 8) | s[0], s + 1) : in;
}
constexpr unsigned long encode(const char* s)
{
return encode_(0, s);
}
constexpr unsigned long operator"" _x(const char* s, long unsigned len)
{
return encode(s);
}
int main(int argc, char **argv)
{
auto x = "hello"_x;
switch (x)
{
case "ola"_x:
break;
case "hello"_x:
break;
}
}