小编Chi*_*roh的帖子

为什么“auto”关键字对于 C 语言的编译器编写者有用?

我目前正在阅读“专家 C 编程 - 深层 C 秘密”,刚刚发现了这个:

\n
\n

auto永远不需要存储类说明符。这对于编译器编写者来说最有意义\n在符号表 \xe2\x80\x94 中创建一个条目,它表示“此存储在进入\n块时自动分配”(而不是在编译时静态分配,或在编译时动态分配)堆)。auto\n对于所有其他程序员来说几乎没有意义,因为它只能在函数内部使用,但是\n函数中的数据声明默认具有此属性。

\n
\n

我看到有人在这里问了同样的事情,但他们没有任何答案,评论中给出的链接仅解释了为什么 C 中有这样一个继承自B 的关键字,以及与 C++ 的差异11 或 C++11 之前版本。

\n

无论如何,我发布的内容是为了重点说明auto关键字在编译器编写中以某种方式有用的部分,但是这个想法是什么以及与符号表的联系是什么?

\n

我确实坚持这样一个事实:我只询问用 C 语言编写编译器时的潜在用法(而不是编写 C 编译器)。

\n

为了澄清这一点,我问这个问题是因为我想知道是否有一个auto可以证明合理的代码示例,因为作者在编写编译器时表示会有。

\n

这里的重点是我认为已经理解了auto(继承自B,它是强制性的,但在C中无用),但我无法想象使用它时的任何示例是有用的(或者至少不是无用的)。

\n

看起来确实没有任何理由使用auto,但是是否有任何旧的源代码或类似的内容与引用的语句相对应?

\n

c compiler-construction keyword auto automatic-storage

40
推荐指数
4
解决办法
5650
查看次数

switch (...) while (0) 的意义是什么?

我最近发现这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 语句。如果我们添加一个: …

c switch-statement

4
推荐指数
1
解决办法
188
查看次数

“if consteval”提案文件中的“SSE 4.2 insanity”是什么意思?

我正在阅读一篇关于if consteval (\xc2\xa73.2)的 C++ 论文,并看到一段显示constexpr strlen实现的代码:

\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n

我是来询问__asm__else分支中的语句的。

\n

我知道这是幽默,并不意味着要认真对待,但我仍然决定做一些研究,以防有人已经解释过。\n当我用谷歌搜索引用的消息时,我得到的结果不到 10 个,全部都是关于这段代码的.\n然后我研究了什么是SSE 4.2,发现它是一个CPU指令集,所以我真的不知道它在C++论文中出现的内容,有人有解释吗?\n感谢那些会阅读的人我的帖子。

\n

c++ sse sse4 c++23

2
推荐指数
1
解决办法
229
查看次数