C++ 错误:"x"不是常量表达式,如何解决?
C++ Error: 'x' is not a constant expression, how to fix?
简而言之,这里有一个最小的例子:
struct C {
const int X = 2;
int y = 2;
};
void f(C* x) {
switch(x->y) {
case x->X: printf("%d", 42); break;
case 123: printf("foo");
}
}
int main()
{
C c;
f(&c);
return 0;
}
为什么编译器抱怨error: 'x' is not a constant expression
,以及如何修复它?
switch
内的Case标签只接受编译时常量表达式。x->X
是而不是常量表达式;因此不能用作CCD_ 4标记。
用if
替换switch
语句以解决此问题:
if (x->y == x->X) {
printf("%d", 42);
} else if (x->y == 123) {
printf("foo");
}
在main中,您声明C的一个实例并将其传递给f。根据f的定义,它不能保证C不会被更改,main也无法验证它。我认为f需要是f(C * const x);
给定的代码(模格式)
struct C
{
int const x = 2;
int y = 2;
};
…意思是:
struct C
{
int const x;
int y;
C(): x( 2 ), y( 2 ) {}
};
…即成员由每个构造函数初始化。
您甚至可以在用户定义的构造函数中重写该初始化:
struct S
{
int const x = 2;
S(): x( 3 ) {}
};
在这里,在每个实例中x
将是3。
所以x
不是一个编译时常数。这在很大程度上是一个运行时的事情。因此,它不能用作switch
中的case
标签,因为case
标签必须是编译时已知的值。反过来,因为switch
构造被设计为在值范围允许的情况下有效地实现为简单的数组索引(计算跳跃)。
一个简单的解决方法是将相关值定义为编译时常数。作为类内的static
或enum
值。或者在课堂之外。
另一个可能的解决方案是使用if
-else
梯形图而不是switch
。
Case接受常量表达式,如2或'a'。Const只是定义了一个不变的变体。
相关文章:
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- Ardunio UNO解决了多个重叠的定时器循环
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 两个文件使用彼此的功能-如何解决
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 如何解决"invalid conversion from 'char' to 'const char*'"
- 在java中解决这段代码时面临循环中的问题
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 难以理解某些人解决IOI问题的源代码
- visual c++,如何获取解决方案目录中的代码
- 如何解决错误:SCIP C++中的 SCIP 阶段无效 <10>
- 节俭并发:未解决的外部问题
- IpOpt拒绝解决不受约束的问题
- 如何解决这个超硬恒星的创造问题
- 循环无限运行C++解决骑士之旅问题
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- C++Matching Brackets 2解决方案不起作用
- 在 ubuntu3 上C++ goto 定义有什么解决方案吗16.04?
- 为什么这段代码不起作用,我该如何解决?