代码之家  ›  专栏  ›  技术社区  ›  Jamison Dance

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

  •  61
  • Jamison Dance  · 技术社区  · 15 年前

    我正在看一些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);
    }
    

    为什么要在代码中插入这样的块?它充满了它们。有什么性能优势吗?什么神秘的东西?为什么????

    编辑: 此代码如果来自 BWA 一个生物信息学程序,使用 Burrows-Wheeler transform 以防你们中的任何一个想知道。此代码示例与应用程序的功能无关。

    9 回复  |  直到 9 年前
        1
  •  89
  •   DigitalRoss    15 年前

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

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

    所以:

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

    …无效,但

    a = 1
    if (e) {
      int i;
    

    …很好,就像一个普通的街区。

    即使在声明生效之后,结果样式仍然继续(c99) 块项目 (s),一部分是由于惯性,一部分是为了向后的可移植性,还因为为新的声明建立一个范围是有意义的。

        2
  •  38
  •   jldupont    15 年前

    范围变量。例如,变量 tmp_argv 仅在大括号之间有效。

        3
  •  7
  •   Paul Lalonde    15 年前

    块是一个范围,它决定变量的生存期以及它们对编译器的可见性。因此,当控件退出块时,在块中创建的变量就会消失。

    当这些变量是带有构造函数和析构函数的类的实例时,它非常方便。

    但是,在您的示例中没有太多的优势。

        4
  •  6
  •   i_am_jorf    15 年前

    它正在创建一个范围。堆栈对象超出范围时将被销毁。它看起来像是在做某种类型的输入,这意味着每个块都是他们想要计时的东西。但是,我没有看到任何范围内的计时器对象,所以,是的,没有任何意义。

        5
  •  6
  •   Mike Weller    15 年前

    我最近发现的另一个用例是,当您具有打开/关闭语义并且希望清楚地标记“内部”代码时:

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

    这很好地提醒您关闭/释放对象,A使代码变得更干净。

        6
  •  5
  •   pgb    15 年前

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

        7
  •  1
  •   Jacob    15 年前

    就这些吗?也许程序员正在使用 tmp_argv 代码中的其他地方。我想不出其他的原因 TMP-AgV 之间 { } 与支架外的任何部分分开。

        8
  •  1
  •   ltgbau    15 年前

    在这些情况下,我有时使用块: -本地化变量 -或者更容易阅读 ……

        9
  •  -2
  •   Bostone    15 年前

    嗯-我可能不在这里,但我认为这样的块中定义的局部变量在块之外是无效的