错误:对于从字符串文字中选择的字符,大小写标签没有减少为整数常量

时间:2019-03-06 19:57:00

标签: c gcc

我使用gcc 8.2编译此代码时遇到此错误:

#define literal "string"
switch(i) {
case literal[0]:
break;
}

在我的示例中,编译器能否将表达式文字[0]减少为“ s”?

3 个答案:

答案 0 :(得分:5)

C2011 6.4.8.2p3要求每个case标签的表达式都是整数常量表达式。整数常量表达式是§6.6p6中定义的常量表达式的受限子集。字符串文字可能不会出现在整数常量表达式中。

6.4.8.2p3是“约束”段落,因此该程序格式错误。

因此,从字面上看,您的问题的答案是:编译器可以"string"[0]减少为's',但不允许这样做;必须拒绝您的程序。

答案 1 :(得分:1)

在那个例子中,理论上是可以的。

但是,显然不是。因此,您无论如何都要编写不同的代码。

扩展弗洛里安的答案:

在使用文字或g++ -std=c++17 -pedantic -O3 -DNDEBUG -flto -march=native -Wall -Wextra -Werror cpp-switch-test.cpp -o cpp-switch-test的C ++中,这确实有效。

使用int main(int, char *argv[]) { constexpr char s[] = "string"; switch (argv[1][0]) { case *s: break; case s[4]: break; case "test"[0]: default: return 1; } return 0; } 编译的示例

class MyPojo {
  List<Double> x;
}

public class Handler implements RequestHandler<MyPojo, ApiGatewayResponse> {
    private static final Logger LOG = Logger.getLogger(Handler.class);

    @Override
    public ApiGatewayResponse handleRequest(MyPojo event, Context context) {
        // event.x is now a list of doubles
    }
}

答案 2 :(得分:0)

C编译器可能会将其他表达式视为整数常量表达式,因此编译器也可能会将其视为常量。

您可以改用当前的C ++编译器:C ++ 11及更高版本将此类表达式视为常量。