使用 GCC 切换案例范围,是不是可以构建一个范围为 [A-Za-z] 的单个案例?

Posted

技术标签:

【中文标题】使用 GCC 切换案例范围,是不是可以构建一个范围为 [A-Za-z] 的单个案例?【英文标题】:With GCC switch case ranges, is it possible to construct a single case that ranges [A-Za-z]?使用 GCC 切换案例范围,是否可以构建一个范围为 [A-Za-z] 的单个案例? 【发布时间】: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 范围包含 éè。 【参考方案1】:

从概念上讲,是否可能出现以下情况?

switch (c.toLatin1()) 
default: 
    foo();
    break;
 case 'A' ... 'Z' || 'a' ... 'z':  
    bar();
    break;

当然,只要写:

switch (c.toLatin1()) 
default: 
    foo();
    break;
 case 'A' ... 'Z':
  case 'a' ... 'z':  
    bar();
    break;

【讨论】:

对此的补充,我继续定义了一个文本宏:#define case_Letter case 'a' ... 'z': case 'A' ... 'Z':,效果很好。

以上是关于使用 GCC 切换案例范围,是不是可以构建一个范围为 [A-Za-z] 的单个案例?的主要内容,如果未能解决你的问题,请参考以下文章

vue和elementui怎么做通过时间范围筛选数据??最好有案例

gcc 标头错误:“_mm256_set_m128d”未在此范围内声明

使用 gcc 编译器时未在此范围内声明“memcpy”

OAuth 2.0 多范围(客户端凭据案例)

错误:此范围内未声明“NULL”

SAP FI 系列 005:业务范围切换都有哪些注意事项?