【发布时间】:2018-11-03 18:29:49
【问题描述】:
下面这个问题Why doesn't gcc allow a const int as a case expression?,和What promoted types are used for switch-case expression comparison?或者Is there any way to use a constant array with constant index as switch case label in C?基本一样。
从第一个链接,我尝试替换:
case FOO: // aka 'const int FOO = 10'
与:
case ((int) "toto"[0]): // can't be anything *but* constant
这给出了:
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) 从键标识符生成唯一的案例标签值,最终让编译器在发生冲突时引发错误,因为发现了类似的标签值。
好的,好的,有人告诉我这些限制是为了简化语言工具(preproc、编译器、链接器),而且 C 不是没有 LISP,但您可以拥有功能齐全的 LISP 解释器/编译器,其大小仅为一个 C 等价物,所以这不是借口。
问题是:C11 是否有一个“扩展”,只允许这个“toto”东西在 GCC、CLANG 和... MSVC 中工作?我不想走 C++ 路径(typedef 的前向声明不再起作用)并且因为嵌入的东西(因此编译时散列计算会导致时空失真)。
是否有一种中间“C+”语言更“宽容”和“理解”嵌入得更好一些,比如-Praise the Lords-“枚举作为位域成员”,以及我们无法拥有的其他好东西(因为 out现实标准的演变就像沙漠阳光下的蜗牛)?
#provemewrong、#changemymind、#norustplease
【问题讨论】:
-
我不知道为什么这被否决了——尤其是没有任何 cmets。这实际上是一个有趣的问题,需要对 C 标准进行一些思考和了解才能回答。不知道为什么它不起作用的人不会知道到哪里去寻找答案。
-
TL;DR 的答案是:因为 C 中整数常量表达式的定义是有缺陷的。他们在 C++ 中修复了它。
-
@AndrewHenle 我注意到一个几乎没有声誉的用户会很快被否决,而声誉较高的用户 [~>2k] - 即使是我问自己的问题 - 快速获得投票。我对这个问题投了赞成票,因为与一些初学者问题相比,我认为它很好,而且还有别的东西。
-
@Al Bundy :谢谢,我不经常使用 stackoverflow,因为我发现它...... 溢出 基本问题。另一方面,我在 Codeproject 上有很好的记录,所以我经常在那里找到我的运气。但由于他们更多是 C++ 或 C# 专家,而且我的问题专门针对 C,所以我来到这里。而且我不在乎愤怒投票,这不会影响我的生活,只要像你这样的好人更加精心和建设性。
-
总而言之,Stack Overflow 问题和 cmets 不适合发表宣言。我建议你在别处写一篇关于这个的文章。
标签: c++ c switch-statement constants constant-expression