这种手动应用范围标准 C 的做法是什么?

Is this practice of manually applying scopes standard C?

只用一对括号创建本地作用域,这会被视为标准 C 语言吗?

#include <stdio.h>

int main(int argc, char *argv[]) {
    {
        register char x = 'a';
        putchar(x); // works
    }
    //putchar(x); wont work
}

还是最好不要使用这个?它是 GCC 编译器扩展吗?

有人告诉我公认的做法是 do {...} while (0); 循环。是否所有 C 编译器都会识别这种做法,就像可以安全地假设任何给定的 C 编译器都会识别 if 语句一样?

我尝试用谷歌搜索这个,我的结果是关于范围行为的,与手动应用范围无关。

是的,是标准的;这是 C 语言支持的块作用域的创建。

关于"best to use"部分,视情况而定,当然这对某些人来说可能有点混乱。

不过,这可能对 生成的 代码非常有用,因此您不需要(尽可能多地)为本地变量使用唯一标识符:

int main(int argc, char *argv[]) {
  {
    int x = 4;
    printf("%d\n", x);
  }
  {
    int x = 5;
    printf("%d\n", x);
  }
}

是的,是标准的;你总是可以引入一个带有额外一对 {}

的新范围

我经常在条件编译代码中使用它,以避免未使用的变量警告:


#if DEBUG
    {
    struct node *tmp;
    for (tmp=this; tmp; tmp= tmp->next) {
        printf(stderr, "Node %u: %s\n", tmp->num, tmp->name);
        }
     }
#endif

这是标准的C。

C standard 的第 6.8p1 节给出了语句的以下语法:

statement:
  labeled-statement
  compound-statement
  expression-statement
  selection-statement
  iteration-statement
  jump-statement

在第 6.8.2p1 节中定义了 compound-statement

compound-statement:
   { block-item-list(opt) }

block-item-list:
  block-item
  block-item-list block-item

block-item:
  declaration
  statement

这就是说,在任何可以出现语句的地方,都可以出现复合语句(即由 {} 包围的一组语句)。