私はいくつかの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の何か?なぜ???
edit:このコードは [〜#〜] bwa [〜#〜] からのもので、小さな配列を整列させるバイオインフォマティクスプログラムです。 Burrows-Wheeler変換 を使用して大規模なリファレンスに変換します。このコード例は、アプリケーションの機能には特に関係ありません。
C89では、int i;
どこでも;宣言はブロックの先頭でのみ有効でした。
そう:
a = 1;
int i; /* error */
i = 2;
...有効ではありませんでしたが、
a = 1
if (e) {
int i;
...普通のブロックのように、大丈夫でした。
結果のスタイルは、宣言が有効になった後も継続しました(C99)block-item(s)、一部は慣性によるもの、一部は後方への移植性のため、また新しい宣言のスコープを確立することが理にかなっているためです.
変数をスコープします。例えば。変数tmp_argv
は中括弧の間でのみ有効です。
私が最近発見したこの別のユースケースは、オープン/クローズのセマンティクスがあり、「内部」コードを明確にマークしたい場合です。
f = fopen('file');
{
// do stuff
}
fclose(f);
これは、オブジェクトを閉じたり解放したりすることを思い出させるためにうまく機能し、コードをいくらかきれいにします。
ブロックとは、変数の有効期間とコンパイラーに対する可視性を決定するスコープです。そのため、ブロック内で作成された変数は、制御がブロックを終了すると消えます。
これらの変数がコンストラクタとデストラクタを持つクラスのインスタンスである場合、非常に便利です。
ただし、この例ではあまり利点はありません。
スコープを作成しています。スタックオブジェクトは、スコープ外になると破棄されます。何らかのタイピングを行っているように見えます。つまり、各ブロックは時間を計りたいと思っているものです。ただし、スコープタイマーオブジェクトは表示されないので、意味がありません。
ブロック内で宣言する変数は、そのブロックに対してローカルです。このようにして、tmp_argv
このコードと競合することなく、コードの他の場所(下記)で。
私は時々これらの場合にブロックを使用します:-変数をローカライズするために-または読みやすくするために...
それだけですか?プログラマーは、コードのどこかでtmp_argv
を使用している可能性があります。 tmp_argv
と{
の間の}
は中括弧の外側とは別なので、他の理由は考えられません。