我目前正在阅读“专家 C 编程 - 深层 C 秘密”,刚刚发现了这个:
\n\n\n\n
auto永远不需要存储类说明符。这对于编译器编写者来说最有意义\n在符号表 \xe2\x80\x94 中创建一个条目,它表示“此存储在进入\n块时自动分配”(而不是在编译时静态分配,或在编译时动态分配)堆)。auto\n对于所有其他程序员来说几乎没有意义,因为它只能在函数内部使用,但是\n函数中的数据声明默认具有此属性。
我看到有人在这里问了同样的事情,但他们没有任何答案,评论中给出的链接仅解释了为什么 C 中有这样一个继承自B 的关键字,以及与 C++ 的差异11 或 C++11 之前版本。
\n无论如何,我发布的内容是为了重点说明auto关键字在编译器编写中以某种方式有用的部分,但是这个想法是什么以及与符号表的联系是什么?
我确实坚持这样一个事实:我只询问用 C 语言编写编译器时的潜在用法(而不是编写 C 编译器)。
\n为了澄清这一点,我问这个问题是因为我想知道是否有一个auto可以证明合理的代码示例,因为作者在编写编译器时表示会有。
这里的重点是我认为已经理解了auto(继承自B,它是强制性的,但在C中无用),但我无法想象使用它时的任何示例是有用的(或者至少不是无用的)。
看起来确实没有任何理由使用auto,但是是否有任何旧的源代码或类似的内容与引用的语句相对应?
我最近发现这switch (...) while (0) {}在 C 中是合法的(此处),但我找不到关于这件事的解释。
我在互联网上唯一一次看到这个是在混淆的 GitHub 存储库中,没有任何解释。
我所有的研究显然都给了我关于 while 或 switch 循环的结果,甚至没有提到这种语法,所以我想这更多是合法的,但非常罕见且可能无用,是对标准的滥用。谁能帮助我理解这一点?
编辑:正如@phuclv答案中所解释的,switch语句需要一个选择语句,它可以是括号内的一些代码(在这种情况下......可能是case语句)或一个带有自己的括号等的循环,这意味着这个在 C 中是合法的:
switch (...) while (...) switch (...) {}
Run Code Online (Sandbox Code Playgroud)
switch根本不关心后面的语句,它似乎只寻找 case(s) 和/或默认值。
switch (1) while (0) {
puts("Not executed");
}
Run Code Online (Sandbox Code Playgroud)
该puts语句不会被执行,因为没有 case/default,所以 switch 在这里基本上没有用。你可以在Compiler Explorer上看到它,GCC 给出警告并删除了开关。
但是,请注意:
#include <stdio.h>
int main(void) {
switch (1) while (1) switch (0) {
case 1:
puts("hello");
}
}
Run Code Online (Sandbox Code Playgroud)
没有显示任何内容,程序立即退出,因为 switch (1) 没有 case 1 或 default 语句。如果我们添加一个: …
我正在阅读一篇关于if consteval (\xc2\xa73.2)的 C++ 论文,并看到一段显示constexpr strlen实现的代码:
constexpr size_t strlen(char const* s) {\n if constexpr (std::is_constant_evaluated()) {\n for (const char *p = s; ; ++p) {\n if (*p == \'\\0\') {\n return static_cast<std::size_t>(p - s);\n }\n } \n } else {\n __asm__("SSE 4.2 insanity"); \n }\n}\nRun Code Online (Sandbox Code Playgroud)\n我是来询问__asm__else分支中的语句的。
我知道这是幽默,并不意味着要认真对待,但我仍然决定做一些研究,以防有人已经解释过。\n当我用谷歌搜索引用的消息时,我得到的结果不到 10 个,全部都是关于这段代码的.\n然后我研究了什么是SSE 4.2,发现它是一个CPU指令集,所以我真的不知道它在C++论文中出现的内容,有人有解释吗?\n感谢那些会阅读的人我的帖子。
\n