【问题标题】:Is it a good practice to use curling braces {} to separate logic modules in C?使用花括号 {} 分隔 C 中的逻辑模块是一种好习惯吗?
【发布时间】:2012-11-13 06:21:55
【问题描述】:

我最近发现我的一位程序员同事写了这样的话:

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

如您所见,内部的两对花括号仅用于在逻辑上分隔两个代码块。虽然我写 C 有一段时间了,但我从未真正见过这种风格。这在 C 中是否被认为是一种好的风格,或者至少是一种可接受的风格?

【问题讨论】:

    标签: c coding-style


    【解决方案1】:

    我不认为这是一种特别好的风格——它多余地增加了缩进,为一条线留下了更少的空间,并且平行地降低了可读性。如果您有多个“逻辑模块”,则可以使用空行将它们分开,例如

    /* declarations */
    char *str;
    size_t size;
    
    /* allocate memory */
    size = 16;
    str = malloc(size);
    if (str == NULL) {
        return -1;
    }
    
    /* do actual task */
    

    等等。或者,如果您有 大量 代码块,您应该考虑对其进行重构 并将它们分解为单独的函数。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        编辑: 正如@DCoder 指出的那样,您的编译器现在很可能使这变得不必要了,也许您的朋友正在使用他很久以前就需要它时学到的技术。

        【讨论】:

        • 这如何让程序使用更少的内存?
        • 我希望一个称职的编译器能够注意到非重叠变量的使用并自行提高内存使用率,而无需像这样手持。
        • @H2CO3:每组大括号都会创建一个新范围,如果您要分配整个函数不需要的大量内存,您可以将其限制在一个区域内。 DCoder:根据编译器,这可能是正确的,也可能不是,但这是一个很好的观点。
        • @lnafziger 我知道变量作用域,但是,你不应该做这样的破解。一,它很可能是由编译器完成的,二,如果你有一个像一百万个long longs 的数组,那么你绝对应该在堆上为它分配内存,而不是塞满堆栈。
        • @H2CO3:我确定您知道变量作用域,但您确实提出了一个明显的问题。您的第二点非常有效,但是在编译器非常聪明之前,我已经看到过去经常使用这样的“黑客”。
        【解决方案4】:

        一般来说,这不是好的风格。此外,在内部范围内声明变量将(不应该)导致更有效的堆栈使用:任何体面的编译器都会优化它。自从允许在任何地方声明变量的 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;
          }
        }
        

        【讨论】:

          【解决方案5】:

          如果您将这些大括号的数量保持在较低水平,那没关系,我已经做到了。

          但是,现在我会说将代码分解为更小的函数,并附上名称/描述。这是一个更好的方法。

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 2017-12-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-12-10
              • 2012-01-03
              • 1970-01-01
              • 1970-01-01
              • 2019-03-11
              相关资源
              最近更新 更多