【问题标题】:Practical use of extra braces in CC中额外大括号的实际使用
【发布时间】:2012-02-20 04:08:30
【问题描述】:

我知道{} 用于分隔函数、类和条件分支等实体,但它们在这里还有什么用处?

#import <stdio.h>

int main(void) {
    {{{
        printf("main\n");
    }}}
    return 0;
}

编辑:

我发现它可能与nested functions 一起主要用于信息隐藏。从下面的答案来看,它们似乎可以在调试期间用作标记,并在发布中被删除,但这不应该得到认可。

【问题讨论】:

  • 在C89函数中间定义新的局部变量。
  • 但是如果没有{}的返回,这有什么用呢?
  • 根据 C 标准,嵌套函数在 C 中是不允许的。您不能在 C 中定义另一个函数的本地函数。但是,您可以在另一个函数中声明一个函数。 GCC 提供了一个 compiler extension 来支持嵌套函数,但使用它会使您的代码在其他编译器中不可移植。

标签: c curly-braces


【解决方案1】:

将代码括在大括号 { } 中会创建一个 Scope
创建本地范围可能有多种原因,例如:

  • 允许您在封闭范围内重用变量名。
  • 在函数中间定义变量。
    在 c89 中不允许在除范围开头之外的任何位置创建变量,但从 c99 开始允许。

Online Example Code Sample

#include<stdio.h>

int main()
{
    int i = 10;
    {
         int i = 5;
         printf("i is [%d]\n",i);
    }
    printf("i is [%d]\n",i);

    return 0; 
}

在您的示例代码中,
额外的{} 没有任何用途,它们只是多余的代码。

正如@Martin 在 cmets 中所建议的那样,由于 {{{}}} 中的封闭代码与 {} 类似,因此可以将其用作标签/模式以便于搜索。

但是,就我个人而言,我更喜欢使用会在搜索中显示的关键字为代码添加适当的注释,而不是添加此类冗余代码。

【讨论】:

  • 所以我想您可以使用它将单个函数中的一组进程分成组
  • 可能是在版本中用“/*”搜索和替换“{{{”的标记
  • @AramKocharyan:注意:Process 这个词有不同的含义,尤其是当您在 c 的上下文中讲话时。要回答您的评论,是的,您可以使用 {``} 来将函数的部分按逻辑分组到不同的范围内。
【解决方案2】:

这种语法(连续三个大括号)在标准 C 中没有任何特殊含义。此类代码的作者可能会使用它来指示内部代码的某些内容,例如它只是用于调试。

【讨论】:

    【解决方案3】:

    额外的大括号为您提供了 Als 提到的范围。这可以有效地用于智能指针的情况。例如,考虑 C++(MSVC 编译器)中的以下代码

    int i = 0;
    i++;
    //More code follows 
    ...
    
    {
        CComBSTR bstr("Hello");
        //use this bstr in some code
        .....
    }
    

    在结束大括号之后,bstr 将不可用。此外,由于它已经超出范围,因此析构函数也会被自动调用。

    【讨论】:

    • 所以作用域可以用来确保执行某些东西,但在堆栈帧返回到原始函数时从本地作用域中删除?
    【解决方案4】:

    你可以引入一个新的作用域,然后允许你引入新的变量......这在 C89 中很有用。虽然不太正常,但偶尔有用。

    {
      int x =2 ;
      printf("%d", x);
      {
        int y = 7;
        printf("%d", y);
      }
    }
    

    【讨论】:

    • 我想知道它们为什么有用。是为了内存管理、安全还是逻辑上分离你的代码?
    • 主要用于在“if”或“while”或“for”之后引入新的代码块:)
    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多