这种手动应用范围标准 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
这就是说,在任何可以出现语句的地方,都可以出现复合语句(即由 {}
包围的一组语句)。
只用一对括号创建本地作用域,这会被视为标准 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
这就是说,在任何可以出现语句的地方,都可以出现复合语句(即由 {}
包围的一组语句)。