他人のコードを解析しているのですが、ソースを見ておりましたら
突然{ }でくくられた処理がありました。(下記参照)
↓このような感じです。
---
memset(Buf, '\0', sizeof(Buf));
GetPrivateProfileString(FileName, HelpFilePath, ", Buf, iBufSize, iniPath);
if(NULL == Buf[0])
{
return FALSE;
}
// この下のくくりが疑問点
{
char sz[_MAX_PATH+1], *lpsz;
strcpy(sz, Buf);
if(GetFullPathName(sz, sizeof(Buf), Buf, &lpsz)==0)
strcpy(szBuffer, sz);
}
---
※if文の下にあるので、elseのかき忘れかな?と思ったのですが、ちがうようです。
この場合、{ }があるのと無いのとではどのような違いがあるのですか?教えて下さい。
よろしくお願いします。
> char sz[_MAX_PATH+1], *lpsz ;
この変数が {} でくくられた範囲でのみ有効となりますので
明示的に「ここからここまでで、閉じた処理」としたい場合に
このような記述をする人もいるようです。
もっと上手い説明がありましたら他の方お願いします。
僕も見たことはあるけど自分ではほとんど使わないので
知ってる知識だけ言うと
{}でくくった部分はブロックといって、
変数の寿命はブロック内。
つまりこの場合、ブロック内で宣言されている
char sz[_MAX_PATH+1], *lpsz;
の寿命は、ブロック内まで。
ブロックの外に出ると寿命は切れてます。
どんなメリットがあるかは、もっと詳しい人フォローお願いしマース。
#とりあえず見やすくなる(?)かな
#
# switch(i)
# {
# case 0:
# {
# int = 0;
# }
# }
#こんなのができるし・・・
ごめんなさい
switch(abc)
{
case 0:
{
int i = 0;
}
}
こうの間違いです
こんにちは
詳しいことはわからないのですが
for( int i = 0; i < 10; i++) TRACE( %d\n, i );
TRACE(2回目のi \n );
{
for( int i = 0; i < 20; i++) TRACE( %d\n, i );
}
こんなことが出来ます。
デバック時に変数名がダブってるときに使ったくらいですが。
>{ }があるのと無いのとではどのような違いがあるのですか?
最適化に影響します。具体的には、オプティマイザに最適化しやすくするヒントを与えます。
例えば、{}で寿命をなるべく短く設定すれば、そのブロック内の変数に割り当てられていた
レジスタが早い段階で解放されます。すると、それをいち早く他用途に当てる事ができます。
ただ、私の場合は
「名前のバッティングを気にせずデバッグコードを書きたい時に使う」
事が多いです。
私は デバッグ用コードを短い変数名(i等)で書く事が多い為、すぐに正規コードの変数名
(ループカウンタ等)とバッティングします。それを避ける為に{}でバリヤをはります。
デバッグ完了後も、コード削除範囲が分かりやすいという利点もあります。
みなさまからたくさんのレスを頂き、誠に感謝いたします。
気になっていたことが解消され、非常に勉強になりました。
お教え頂いたホームページも大変参考になりました。ありがとうございます。
そして、こういった有用な掲示板を提供・運営されておられます管理人様にも
感謝したいと思います。
