【问题标题】:Meaning of lone curly-braced code blocks in CC中孤花括号代码块的含义
【发布时间】:2011-04-07 21:15:45
【问题描述】:

我遇到了一些代码,其中包含几个代码块,用花括号 {} 描述。代码块之前没有一行将它们标记为if 语句、函数定义或其他任何内容的一部分。只是一个漂浮在函数中间的代码块。这有什么意义吗? gcc 似乎非常高兴通过代码;我只能想象这是一种允许原始编码人员在视觉上分割功能块的方法......

【问题讨论】:

  • stackoverflow.com/questions/1677778/… @Goathens,我认为上述网址中提出的问题将回答您的问题。
  • @Anil 是的。我保证在发布之前我确实尝试过找到类似的问题!

标签: c syntax formatting


【解决方案1】:

它创建了一个范围。块内是否定义了自动变量?如果是这样,那么这些变量的范围仅限于块。它对于您不想污染函数其余部分的临时变量很有用,并且在编写 C89 时也很有用,其中变量定义必须位于块的开头。

所以,而不是:

int main() {
    int a = 0;
    int b;
    int i;

    for (i = 1; i < 10; ++i) {
        a += i;
    }

    b = a * a;
    // do something with a and b
}

你可以:

int main() {
    int a = 0;
    {
        int i;
        for (i = 1; i < 10; ++i) {
            a += i;
        }
    }

    {
        int b = a * a;
        // do something with a and b
    }
}

显然,如果您这样做,您还必须问自己,这些块作为单独的函数是否会更好。

【讨论】:

  • +1 示例和一些关于为什么有人会使用范围界定的讨论。
  • 当您说“污染其余功能”时,您指的是可读性/可维护性吗?或者你的意思是这种技术可以帮助节省内存?还是别的什么?
  • @AndyJ0076:可读性/可维护性。它可以节省内存,这取决于编译器,但这不是我的意思,因为它不能可靠地这样做。 IIRC 编译器通常为整个函数放置一个堆栈帧,而不管其中变量的范围如何。如果他们重用堆栈槽,则至少与编译器自身的活性分析一样可能是由于范围界定。
【解决方案2】:

独立的花括号用于范围界定——在块中声明的任何变量在块外都不可见。

【讨论】:

  • 当与 RAII 结合使用时,这是一个非常强大的 C++ 工具。
【解决方案3】:

如果代码块包含局部变量声明(您的描述不清楚里面有什么),它们可能会限制这些变量的范围。即

int i = ...;
// i is visible here
{
  int j = ...;
  // both i and j are visible here
}
// j went out of scope, only i is visible here

【讨论】:

    【解决方案4】:

    它用于创建范围。如果对声明只能在此范围内使用的变量有用,则为范围。例如,如果在大括号之前声明了一个变量,则可以在大括号之后的大括号内使用它。相反,如果在大括号内声明变量,则只能在大括号内使用。 希望这会有所帮助。

    【讨论】:

      【解决方案5】:

      这通常意味着它是为了在更大的函数中声明一个变量而编写的,但该变量只需要非常有限的范围,甚至可能需要隐藏一些东西。它是完全合法的——它只是引入了一个块。大问题始终是“该代码的正确缩进是什么”。

      它也可以被用于将其他语言转换为生成的 C 的预处理器使用。转换后的材料通常包装在一个块中(也可能是 #line 指令)。

      【讨论】:

        猜你喜欢
        • 2014-07-28
        • 2017-04-07
        • 2010-12-13
        • 1970-01-01
        • 2015-12-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多