关注这个问题为什么gcc不允许将const int作为case表达式?,什么促销类型用于switch-case表达式比较基本相同?或者有没有办法在C中使用具有常量索引的常量数组作为开关案例标签?.
从第一个链接,我试图替换:
case FOO: // aka 'const int FOO = 10'
Run Code Online (Sandbox Code Playgroud)
用:
case ((int) "toto"[0]): // can't be anything *but* constant
Run Code Online (Sandbox Code Playgroud)
这使 :
https://ideone.com/n1bmIb - > https://ideone.com/4aOSXR =在C++中工作
https://ideone.com/n1bmIb - > https://ideone.com/RrnO2R = C失败
我不太明白,因为"TOTO"字符串不能是任何东西,但一个常数之一,它甚至不是一个变量,它位于编译器内存的空白.我甚至没有玩C语言的'const'模糊逻辑(它实际上代表"只读,不是常数,你期望什么?"),问题是"数组访问"或"指针引用" "进入一个不用C语言评估的常量表达式,但在C++中做得很好.
我希望使用这个"技巧"来使用HASH_MACRO(str)从密钥标识符生成唯一的case标签值,最终使编译器在发生冲突时引发错误,因为找到了类似的标签值.
好的,好的,我被告知这些限制是为了简化语言工具(preproc,编译器,链接器)而C不是没有LISP,但你可以拥有全功能的LISP解释器/编译器,其大小只相当于C等价物的一小部分,所以这不是借口.
问题是:C11是否有"扩展",只允许这个"toto"东西在GCC,CLANG和...... MSVC中工作?我不想去C++路径(typedef的前向声明不再起作用)和嵌入式东西(因此编译时哈希计算用于时空失真).
是否有一种中间的"C +"语言更加"宽容"和"理解"嵌入更好一点,比如 - 赞美领主 - "作为位域成员的枚举",以及我们不能拥有的其他很好的东西(由于以外的原因)现实标准像沙漠太阳下的蜗牛一样演变?
#provemewrong,#changemymind,#norustplease