0

可能重复:
在 C 中实际使用额外的大
括号 C++ 中不必要的花括号?

大括号的用途是什么,例如下图:

int var;
{
  some coding...
  ...
}

大括号之前没有函数名,也没有 typedef 等。

更新:我在 gwan sqlite.c 示例中找到了这段代码, http
://gwan.com/source/sqlite.c 我在下面部分引用了它:

...some coding
sqlite3_busy_timeout(db, 2 * 1000); // limit the joy

   // -------------------------------------------------------------------------
   // create the db schema and add records
   // -------------------------------------------------------------------------
   {   //<-- here is the starting brace
      static char *TableDef[]=
      {
         "CREATE TABLE toons (id        int primary key,"
                             "stamp     int default current_timestamp,"
                             "rate      int,"
                             "name      text not null collate nocase unique,"
                             "photo     blob);",
         // you can add other SQL statements here, to add tables or records
         NULL
      };
      sqlite3_exec(db, "BEGIN EXCLUSIVE", 0, 0, 0);
      int i = 0;
      do
      { 
         if(sql_Exec(argv, db, TableDef[i])) 
         {
            sqlite3_close(db);
            return 503;
         }
      }
      while(TableDef[++i]);

      // add some records to the newly created table
      sql_Exec(argv, db, 
               "INSERT INTO toons(rate,name) VALUES(4,'Tom'); "
               "INSERT INTO toons(rate,name) VALUES(2,'Jerry'); "
               "INSERT INTO toons(rate,name) VALUES(6,'Bugs Bunny'); "
               "INSERT INTO toons(rate,name) VALUES(4,'Elmer Fudd'); "
               "INSERT INTO toons(rate,name) VALUES(5,'Road Runner'); "
               "INSERT INTO toons(rate,name) VALUES(9,'Coyote');");

      sqlite3_exec(db, "COMMIT", 0, 0, 0);

      // not really useful, just to illustrate how to use it
      xbuf_cat(reply, "<br><h2>SELECT COUNT(*) FROM toons (HTML Format):</h2>");
      sql_Query(argv, db, reply, &fmt_html, "SELECT COUNT(*) FROM toons;", 0);
   } //<-- here is the ending brace  
...some coding
4

3 回答 3

3

语句可以分组为,大括号表示块的开始和结束。函数体是一个块。块引入了一个新的变量范围,它从左大括号开始,到右大括号结束。

你所拥有的是一个块。

于 2012-12-13T11:51:12.010 回答
2

没有函数名的大括号用法

我想,与其说答案是什么,不如把重点放在为什么这样做。

例如,您可以使用不同的类型重用变量名来做其他事情(SQLite 示例这样做是为了在从头开始时继续使用相同的术语,而不是冒着命名冲突的风险):

{
   int i = 2; 
   ...
   {
      int i = 10; // this is a different variable

      // the old value of 'i' will be restored once this block is exited.
   }
}
{
   void *i = alloca(16 * 1024); // this memory will be freed automatically
   ...                          // when the block will be exited
}

但这也可以让您释放在堆栈上分配的内存alloca(),就像上面所做的那样。

这也清楚地表明编译器不再需要块中定义的变量(这对于确保为其他任务释放 CPU 寄存器很有用)。

如您所见,定义范围可以具有外观技术用途。两者都很有用。

于 2012-12-13T15:55:22.590 回答
1

在 {} 中为局部变量创建新范围

例如在C

fun(){ 
  int i;   // i -1
  {
    int i;   // i -2 its new variable 
  }

}
于 2012-12-13T11:51:14.800 回答