我最近发现我的一位程序员同事写了如下内容:
int foo()
{
//some code
{
//some code
}
//some code
{
//some code
}
//some code
}
如您所见,内部的两对花括号仅用于在逻辑上分隔两个代码块。虽然我写 C 有一段时间了,但我从未真正见过这种风格。这在 C 语言中被认为是一种好的风格,或者至少是一种可接受的风格吗?
我最近发现我的一位程序员同事写了如下内容:
int foo()
{
//some code
{
//some code
}
//some code
{
//some code
}
//some code
}
如您所见,内部的两对花括号仅用于在逻辑上分隔两个代码块。虽然我写 C 有一段时间了,但我从未真正见过这种风格。这在 C 语言中被认为是一种好的风格,或者至少是一种可接受的风格吗?
我不认为这是一种特别好的风格——它多余地增加了缩进,为一条线留下了更少的空间,同时它降低了可读性。如果您有多个“逻辑模块”,则可以使用空行将它们分开,例如
/* declarations */
char *str;
size_t size;
/* allocate memory */
size = 16;
str = malloc(size);
if (str == NULL) {
return -1;
}
/* do actual task */
等等。或者,如果你有大量代码,你应该考虑重构它并将它们分解成单独的函数。
一般来说,不,这不是好的风格。此外,在内部范围内声明变量将(不应该)导致更有效的堆栈使用:任何体面的编译器都会优化它。自从允许在任何地方声明变量的 C++ 在 90 年代初开始流行以来,他们就能够做到这一点。
然而,在内部范围内声明变量将减少其他范围的“命名空间污染”。根据经验,变量最好只在使用它的范围内可见。
因此,在我看来,在一些例外情况下,大括号会被认为是好的风格。最明显的例子是 C90 中的 switch 语句:
switch(x)
{
case 1:
{
/* now you can declare local variables here */
int my_local;
break;
}
case 2:
{
int some_other_local_only_related_to_case_2;
break;
}
}
这通常是为了限制变量的范围,并且可以使您的程序使用更少的内存。
编辑:正如@DCoder 指出的那样,您的编译器现在很可能使这变得不必要了,也许您的朋友正在使用他很久以前就需要它时学到的技术。
大括号引入了一个嵌套作用域,例如,您可以在其中再次使用相同的变量名,我从来没有真正需要它,我认为它显示出糟糕的编码并使阅读代码的人感到困惑。
int foo()
{
int a;
//some code
{
int a;
}
}
如果您放入 {} 的代码可以独立存在,则可能值得将该代码放入一个函数中,即使它是一个 void 函数。这样,该函数中使用的变量的命名空间就受到了限制,并且您将代码分割成更易于管理的部分。我一直这样做是为了组织我的代码并保持其可读性/易于维护。
如果您将这些大括号的数量保持在较低水平,那没关系,我已经做到了。
但是,现在我想说将代码分解成更小的函数,并带有名称/描述。这是一个更好的方法。