在C语言中使用大括号{}来分隔逻辑模块是一种好的做法吗?

在C语言中使用大括号{}来分隔逻辑模块是一种好的做法吗?,c,coding-style,C,Coding Style,我最近发现我的一位程序员同事写了这样的东西: 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语言中,这被认为是一种好的,或者至少是一种可以接受的风格吗?

这样做通常是为了限制变量的范围,并且可以使程序使用更少的内存

编辑:
正如@DCoder所指出的,现在你的编译器很可能不需要这些,也许你的朋友正在使用他很久以前在更需要它的时候学到的技术。

这样做通常是为了限制变量的范围,并且可以使你的程序使用更少的内存

编辑:
正如@DCoder所指出的,您的编译器现在很可能不需要这个功能,也许您的朋友正在使用他很久以前就学会的技术,当时对它的需求更大。

我认为这不是一种特别好的样式-它会过多地增加缩进,减少行的空间,并且并行,它降低了可读性。如果您有多个逻辑模块,您可以使用空行分隔它们,如

/* declarations */
char *str;
size_t size;

/* allocate memory */
size = 16;
str = malloc(size);
if (str == NULL) {
    return -1;
}

/* do actual task */

等,或者,如果你有大量的代码,你应该考虑重构它,并把它们分解成单独的函数。

< P>我不认为这是一种特别好的样式——它多余地增加了压痕,留下了较少的行空间,并行地,它降低了可读性。如果您有多个逻辑模块,您可以使用空行分隔它们,如

/* declarations */
char *str;
size_t size;

/* allocate memory */
size = 16;
str = malloc(size);
if (str == NULL) {
    return -1;
}

/* do actual task */

等,或者,如果你有大量的代码,你应该考虑重构它,并把它们分解成单独的函数。

< P>括号引入一个嵌套的范围,在这里你可以,例如,使用相同的变量名,我从来没有真正需要它,我认为它显示了糟糕的编码和混淆谁读代码。
int foo()
{
    int a;
    //some code
    {
        int a;
    }
}

大括号引入了一个嵌套的作用域,例如,您可以再次使用相同的变量名,我从来没有真正需要它,我认为它显示了糟糕的编码,并混淆了阅读代码的人

int foo()
{
    int a;
    //some code
    {
        int a;
    }
}

如果你把牙套的数量保持在低水平,那没关系,我已经做到了


但是,现在我要说的是,将代码分解成更小的函数,包括名称/描述。这是一种更好的方法。

如果你把牙套的数量保持在较低的水平,那没关系,我已经做了


但是,现在我要说的是,将代码分解成更小的函数,包括名称/描述。这是一种更好的方式。

一般来说,这不是一种好的风格。此外,在内部作用域中声明变量不应导致更有效的堆栈使用:任何合适的编译器都会对此进行优化。他们已经能够做到这一点,因为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;
  }
}

一般来说,不,这不是好风格。此外,在内部作用域中声明变量不应导致更有效的堆栈使用:任何合适的编译器都会对此进行优化。他们已经能够做到这一点,因为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;
  }
}

如果您放入{}的代码可以独立运行,那么将该代码放入函数可能是值得的,即使它是一个void函数。这样,该函数中使用的变量名称空间就受到限制,您可以将代码分割成更易于管理的部分。我一直这样做是为了组织我的代码并使其可读/易于维护。

如果您放入的代码{}可以独立存在,那么将该代码放入函数可能是值得的,即使它是一个空函数。这样,该函数中使用的变量名称空间就受到限制,您可以将代码分割成更易于管理的部分。我一直这样做是为了组织代码并使其可读/易于维护。

这如何使程序使用更少的内存?我希望有能力的编译器能够注意到非重叠变量的使用并自行提高内存使用率,而不需要像这样手握。@H2CO3:每一组大括号都会创建一个新的作用域,如果要分配整个函数不需要的大量内存,可以将其限制在一个区域内。直流
奥德:从编译器的角度来看,这可能是真的,也可能不是真的,但这是一个很好的观点。@lnafziger我知道变量作用域,但是,你不应该这样做。第一,这可能是由编译器完成的;第二,如果你有一个一百万长的数组,那么你肯定应该在堆上为它分配内存,而不是塞满堆栈。@H2CO3:我肯定你知道变量作用域,但你确实问了一个明显的问题。你的第二点是非常正确的,但是在编译器变得非常智能之前,我已经看到类似的黑客在过去经常使用。这如何使程序使用更少的内存?我希望一个有能力的编译器注意到非重叠变量的使用,并自行提高内存使用率,不需要像这样用手握住。@H2CO3:每一组大括号都会创建一个新的作用域,如果要分配整个函数不需要的大量内存,可以将其限制在一个区域内。DCoder:根据编译器的情况,这可能是真的,也可能不是真的,但这是一个很好的观点。@lnafziger我知道变量作用域,但是,你不应该这样做。第一,这可能是由编译器完成的;第二,如果你有一个一百万长的数组,那么你肯定应该在堆上为它分配内存,而不是塞满堆栈。@H2CO3:我肯定你知道变量作用域,但你确实问了一个明显的问题。你的第二点是非常正确的,但是在编译器变得非常智能之前,我已经看到像这样的黑客在过去经常使用。