为什么用大括号括起C代码块?

我正在查看一些C代码,并且已经注意到它充满了围绕代码块的这些大括号,没有任何控制结构。 看一看:

//do some stuff . . . fprintf(stderr, "%.2f sec\n", (float)(clock() - t) / CLOCKS_PER_SEC); { //a block! why not? char *tmp_argv[3]; tmp_argv[0] = argv[0]; tmp_argv[1] = str; tmp_argv[2] = prefix; t = clock(); fprintf(stderr, "[bwa_index] Convert nucleotide PAC to color PAC... "); bwa_pac2cspac(3, tmp_argv); fprintf(stderr, "%.2f sec\n", (float)(clock() - t) / CLOCKS_PER_SEC); } 

你为什么要在代码中插入这样的块? 它充满了时间。 有没有某种性能好处? 一些神秘的C东西? 为什么???

编辑:这个代码如果来自BWA ,一个生物信息学程序,使用Burrows-Wheeler变换将小序列与大参考序列alignment,以防万一您想知道。 此代码示例与应用程序的function无关。

遗留代码需要{}才能完成声明

在C89中,你不能只是做int i; 任何地方; 声明只在块的开始处有效。

所以:

 a = 1; int i; /* error */ i = 2; 

…无效,但是

 a = 1 if (e) { int i; 

…很好,就像一个平坦的块。

即使在声明变得有效(C99) 块项之后,由此产生的风格仍然存在,部分是由于惯性,部分是为了向后移植,还因为为新声明build立一个范围是有意义的。

范围variables。 例如,variablestmp_argv只在大括号之间有效。

块是一个范围,决定variables的生命周期,以及它们对编译器的可见性。 因此,当控件退出块时,在块内创build的variables将消失。

当这些variables是具有构造函数和析构函数的类的实例时,它可以非常方便。

但是,在你的例子中没有太大的优势。

它正在创造一个范围。 堆栈对象在超出范围时被销毁。 看起来它正在做某种types的打字,这意味着每个区块都是他们想要的时间。 但是,我没有看到任何范围定时器对象,所以,是的,没有任何意义。

您在块内声明的variables对于该块是本地的。 这样你可以在代码的其他地方重新定义tmp_argv (下面),而不会与这段代码冲突。

我最近发现的另一个用例是当你打开/closures语义,并且你想清楚地标记“内部”代码:

 f = fopen('file'); { // do stuff } fclose(f); 

这很好地提醒你closures/释放对象,并使代码更清洁。

这是全部吗? 也许程序员正在代码中的其他地方使用tmp_argv 。 我不能想到任何其他的原因,因为{}之间的tmp_argv和大括号之外的任何东西都是分开的。

我有时在这些情况下使用块: – 本地化variables – 或更容易阅读…

嗯 – 我也许不在这里的图表,但我认为这个块内部的局部variables定义在块之外是无效的