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
    带有函数指针
  • if/else if/else梯形图 注意:
    std::map
    或lookup table的一个问题是所有函数必须具有相同的签名。C++语言不允许在结构或查找表中查找不同类型的函数指针。p> 来自:

    条件-整型或枚举类型的任何表达式,或上下文可隐式转换为整型或枚举类型的类类型的任何表达式,或带有大括号或等于初始值设定项的此类类型的单个非数组变量的声明

    我现在找不到正式的文档,但
    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;
      }
    }