2012-01-27 36 views
1

我知道{}是用来分隔函数,类和条件分支等实体,但他们还有什么其他用途?在C中实际使用额外的大括号

#import <stdio.h> 

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

编辑:

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

+1

在C89的函数中定义新的局部变量。 – osgx 2012-01-27 03:50:02

+0

但是没有'{}'的返回会有什么用? – 2012-01-27 03:51:22

+0

*根据C标准,C中不允许嵌套函数*。您无法在C中定义另一个函数的本地函数。然而,您可以在另一个函数内声明函数.GCC提供了[编译器扩展](http:// gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html)来支持嵌套函数,但是使用它会使你的代码在其他编译器中不可移植。 – 2012-01-27 04:49:58

回答

5

括在括号{}一个代码创建一个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; 
} 

在你的示例代码,
额外{ & }不会起任何作用,他们只是冗余代码。

正如@马丁建议在意见,因为在{{{ & }}}封闭代码仅仅是类似于{ & },它可能被用作容易搜索的标签/模式。然而,就个人而言,我更希望为代码添加适当的评论,并在关键字中显示搜索结果,而不是添加此类冗余代码。

+0

所以我想你可以用它来将一组函数中的一组进程分成组 – 2012-01-27 03:53:30

+1

可能是一个标记,用于在发布 – 2012-01-27 03:54:17

+1

@AramKocharyan中搜索和替换“{{{”和“/ *”:警告:该词* Process *具有不同的含义,特别是当你在c语境下讲话时。要回答你的评论,是的,你可以使用'''''将你的函数的* sections *逻辑地分组到不同的作用域。 – 2012-01-27 04:02:54

2

该语法(连续三个花括号)并不意味着标准C中的任何特殊内容。此类代码的作者可能会使用它来指示内部代码的某些内容,例如它只是用于调试。

0

额外的大括号给你作为阿尔斯提到的范围。这可以有效地用于智能指针的情况。例如,考虑在C++(MSVC编译器)下面的代码

int i = 0; 
i++; 
//More code follows 
... 

{ 
    CComBSTR bstr("Hello"); 
    //use this bstr in some code 
    ..... 
} 

结束括号后,bstr将不可用。而且,因为它已经超出了范围,所以析构函数也会自动调用。

+1

这是标签c。 – 2012-01-27 03:55:00

+0

因此,作用域可以用来确保执行某些东西,但是当堆栈帧返回到原始函数时,它会从本地作用域中删除? – 2012-01-27 03:56:25

2

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

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

我想知道的是为什么他们有用。它是用于内存管理还是安全性,还是逻辑上将代码分离? – 2012-01-27 03:58:48

+0

主要它们对于在“if”或“while”或“for”之后引入新的代码块很有用:) – 2012-01-27 08:34:43