在 switch 语句中使用 const int 变量

Posted

技术标签:

【中文标题】在 switch 语句中使用 const int 变量【英文标题】:Using const int variable in switch statement 【发布时间】:2013-04-30 22:53:05 【问题描述】:

我正在使用带有 -std=c++11 标志的 gcc。在我的类定义中,我有以下内容:

private:
   const int   January     = 1,
               February    = 2,
               March       = 3,
               ...

在我的实现中,我有一个 switch 语句。

switch (currentMonth)

   case January:
      returnString = "January";
      break;
   case February:
      returnString = "February";
      break;
   case March:
      returnString = "March";
      break;
   ...

这似乎应该有效,因为月份是恒定的;但是,gcc 给了我

calendar.cpp:116:12: error: ‘this’ is not a constant expression

在 switch 语句的每种情况下..为什么这是错误的?

【问题讨论】:

您的示例中的哪一行是116,如果分配,它是一个吗?还是switch 本身的案例? 我将帖子编辑得更清楚 【参考方案1】:

非静态类成员不是常量表达式。试试这个:

static constexpr int January = 1;

【讨论】:

+1,大概就是这个了。请注意,对于与 c++03 兼容的内容,static const int January = 1; 也可以使用。 我不熟悉static这个关键字,但我的印象是使用new会创建一个静态对象;那么这是否意味着这与使用new 相同?这意味着在我的析构函数中,我需要对其中的每一个调用 delete ?还是完全不同? @kennycoc:不,使用new 不会创建静态对象,你从哪里听到的? 我正在通过复数视觉学习 C++。我确定我误会了。【参考方案2】:

试试这个:

enum 
 January = 1,
 February = 2
 ...
;

【讨论】:

更好的是,尝试一些可以编译的东西。 enum int 应该只是 enum (或者,在 C++11 中,如果出于某种原因特别希望底层类型为 int,则可能是 enum : int),并且它需要声明后的分号。 如果您有浏览器和互联网连接,那么您可以访问编译器。很多,其实。例如:ideone.com @BenjaminLindley 很酷,谢谢。我只知道 jsfiddle 和 repl.it 一些更新给那些将要查看的人:使用enum class 而不是enum,它会为您提供类型检查

以上是关于在 switch 语句中使用 const int 变量的主要内容,如果未能解决你的问题,请参考以下文章

Android检查int是不是在区间+ switch语句中

csharp Switch语句就像流线条件一样。当您想要将单个变量与一系列const进行比较时,它们非常有用

switch语句能否作用在byte,long,string上

c ++ int switch语句总是转到`default`

019_增强switch语句

consttypedef define总结