我正在Qt中创建一个函数,根据收到的密钥打印出不同的东西。
我已经存储了要在单独的头文件中进行比较的密钥,在一个名为 reference 的单独名称空间中。 switch语句只想“看到”密钥的未初始化声明,因此认为我正在与非常量值进行比较。 但是我不是,因为值确实是在命名空间的源文件中初始化的。我当然不能在标题中初始化我的键,因为这将创建多个定义。
如何“告诉”我的交换机案例我实际上已经初始化了我正在比较的键?
void MainWindow::printOuts(char key, float value)
{
const int test1 =2;
const int test2 = (const int)reference::potentiometer;
const char test3= reference::potentiometer;
const char test4 =0;
//const char potentiometer lies in a namespace called reference
if(key==reference::potentiometer)
{//works
qDebug()<<"Got a potentiometer value!!";
}
switch (key)
{
case test1: //Works ok
case test2: //gives "cannot appear in a constant-expression"
case test3: ////gives "cannot appear in a constant-expression"
case test4: //Works ok
}
}
答案 0 :(得分:2)
reference::potentiometer
需要在此编译单元中定义为常量表达式,而不仅仅是具有外部链接的常量。在声明的标题中定义它的值,这样可以正常工作。
答案 1 :(得分:1)
您只能使用编译时常量作为switch语句中的潜在值。您的第二个和第三个值是在运行时确定的,因为它们是在不同的编译单元中定义的。
答案 2 :(得分:1)
正如许多其他贡献者所说,你不能拥有一个case
,其中的值在编译时并不准确。
test1
已知;它是2
。
test4
已知;它是0
如果您的代码需要使用相同的算法编写,则可以使用级联switch
语句替换整个if
语句,如下所示:
if (key == test1) {
// ...
} else if (key == test2) {
// ...
} else if (key == test3) {
// ...
} else if (key == test4) {
// ...
} else {
// default code goes here
}
答案 3 :(得分:0)
你应该能够在不同的标题中定义const(我试过它并且它有效),但是电位计需要被定义为const,而不是作为const的类型转换。在您当前的代码中,即使测试2和测试3是consts,如果电位计不是const,那么每次输入此方法时,测试用例2和3可能具有不同的值。使用当前代码,您将遇到另一个错误,因为您使用了相同的案例两次(test2和test3)。
(switch语句不允许进行变量比较的主要原因是它们可以在编译时进行优化。)