[英]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.