簡體   English   中英

為什么將C代碼塊括在花括號中?

[英]Why enclose blocks of C code in curly braces?

我正在看一些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變換將小序列與大參考序列對齊,以防萬一您想知道的話。 此代碼示例與應用程序的功能並不特別相關。

舊版代碼需要{}才能進行聲明

在C89中,您不能只做int i; 任何地方 聲明僅在塊的開頭有效。

所以:

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

...無效,但

a = 1
if (e) {
  int i;

...很好,就像一個普通的街區一樣。

即使在聲明變為有效(C99) 塊項目之后,結果樣式仍繼續存在,部分原因是慣性,部分原因是為了向后移植,也因為建立新聲明的范圍是有意義的。

范圍變量。 例如,變量tmp_argv僅在括號之間有效。

塊是一個范圍,它確定變量的生存期以及它們對編譯器的可見性。 因此,當控件退出該塊時,在該塊中創建的變量將消失。

當這些變量是具有構造函數和析構函數的類的實例時,這可能非常方便。

但是,在您的示例中,沒有太多優勢。

我最近發現的另一個用例是,當您具有打開/關閉語義並且要清楚地標記“內部”代碼時:

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

這很好地提醒您關閉/釋放對象,並使代碼更簡潔。

它正在創建范圍。 堆棧對象超出范圍時將被銷毀。 看起來它正在進行某種類型的輸入,這意味着每個塊都是他們想要的時間。 但是,我看不到任何有作用域的計時器對象,因此是沒有道理的。

您在塊內聲明的變量是該塊的局部變量。 這樣,您就可以在代碼的其他位置(以下)重新定義tmp_argv而不與這段代碼沖突。

這就是全部嗎? 也許程序員在代碼的其他地方使用了tmp_argv 我想不出任何其他原因,因為{}之間的tmp_argv與大括號之外的任何內容分開。

在以下情況下,我有時會使用塊:-本地化變量-或更易於閱讀...

嗯-我可能不在這里,但我認為此類塊內的局部變量定義在該塊外無效

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM