切换案例拒绝将常量识别为已初始化

时间:2013-12-09 20:07:59

标签: c++ qt switch-statement

我正在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
    }


}

4 个答案:

答案 0 :(得分:2)

reference::potentiometer需要在此编译单元中定义为常量表达式,而不仅仅是具有外部链接的常量。在声明的标题中定义它的值,这样可以正常工作。

答案 1 :(得分:1)

您只能使用编译时常量作为switch语句中的潜在值。您的第二个和第三个值是在运行时确定的,因为它们是在不同的编译单元中定义的。

答案 2 :(得分:1)

正如许多其他贡献者所说,你不能拥有一个case,其中的值在编译时并不准确。

test1已知;它是2test4已知;它是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语句不允许进行变量比较的主要原因是它们可以在编译时进行优化。)