为什么用大括号括起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定义在块之外是无效的