【发布时间】:2019-07-17 16:46:50
【问题描述】:
非常直接的问题。 GCC 的 Case 范围允许这样的事情:
switch (c.toLatin1()) {
default: {
foo();
break;
} case 'A' ... 'Z': {
bar();
break;
} case 'a' ... 'z': {
bar();
break;
}
https://gcc.gnu.org/onlinedocs/gcc/Case-Ranges.html
然而,这里的问题是bar() 是多余的,'A' ... 'z' 最终会包含一堆不需要的字符:
从概念上讲,是否可能出现以下情况?
switch (c.toLatin1()) {
default: {
foo();
break;
} case 'A' ... 'Z' || 'a' ... 'z': {
bar();
break;
}
显然这是伪代码,但你明白了。 如果需要,解决方案可以包括文本宏。我更担心不小心引入错误,因为我忘记添加新代码:
switch (c.toLatin1()) {
default: {
foo();
break;
} case 'A' ... 'Z': {
foo(); // I add here
bar();
break;
} case 'a' ... 'z': {
bar(); // but forget to add it here too.
break;
}
因为这两种情况实际上是一种情况。 谢谢。
【问题讨论】:
-
请注意,
'A'-'Z'不能保证是连续的,例如 EBCDIC。 -
@Jarod42 你不是说
'A' ... 'Z'吗?另外,您可以扩展 EBCDIC 吗?如果它是一个平台的东西,我可以#define一个可以保证连续行为的文本宏吗? -
EBCDIC 中的 A..Z 范围包含 éè。
标签: c++ qt gcc duplicates switch-statement