我使用gcc 8.2编译此代码时遇到此错误:
#define literal "string"
switch(i) {
case literal[0]:
break;
}
在我的示例中,编译器能否将表达式文字[0]减少为“ s”?
答案 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及更高版本将此类表达式视为常量。