我在看一些C代码,注意到它充满了这些花括号,围绕着没有任何控制 struct 的代码块.看一看:

//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);
}

为什么要在代码中插入这样的块?里面塞满了.有什么性能优势吗?一些神秘的东西?为什么?

edit: 这段代码来自BWA,这是一个生物信息学程序,使用Burrows-Wheeler transform将小序列与大参考序列对齐,以防你们中的任何人感到疑惑.这个代码示例与应用程序的功能不是特别相关.

推荐答案

需要{}遗留代码才能进行声明

在C89中,不能在任何地方执行int i;;声明只在块的开头有效.

所以:

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

.是无效的,但是

a = 1
if (e) {
  int i;

.可以了,就像一杯普通的挡路一样.

即使在声明变得有效(C99)block-item(s)之后,最终的样式仍在继续,部分原因是惯性,部分原因是向后可移植性,还因为为新声明建立范围是有意义的.

C++相关问答推荐

在严格的C89模式下,收件箱不会在' uint64_t '上发出警告

使用SWI—Prolog的qsave_program生成二进制文件有什么好处?'

通过MQTT/蚊子发送大文件—限制在4MB

Can函数指针指向C++中具有不同参数连续性的函数

如何将字符串传递给函数并返回在C中更改的相同字符串?

C语言编译阶段与翻译阶段的关系

使用scanf在C中读取和存储文件中的值

是否可以使用指针算法在不对齐的情况下在 struct 中相同类型的字段的连续序列之间移动?

Make Node函数.S有什么问题吗?

如何在下面的C代码中正确管理内存?

无法在OpenGL上绘制三角形

ifdef __cplusplus中的整数文字单引号

C将数组传递给函数以修改数组

从BIOS(8086)中读取刻度需要多少?

如何逐位读取二进制文件?

浮点正零何时不全为零?

在NASM中链接Linux共享库时出错-';将R_ X86_64_;foo';

Ubuntu编译:C中的文件格式无法识别错误

通过修改c中的合并排序对数组的偶数索引进行排序

保存有符号整数结果的变量是否会溢出(后增量的副作用),并且此后从未在任何表达式中使用过它,是否会导致 UB?