突然あらわれた{ } について

[戻る]
ベホマラー 2002/07/15(月) 15:24:02
他人のコードを解析しているのですが、ソースを見ておりましたら
突然{ }でくくられた処理がありました。(下記参照)
↓このような感じです。
---
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のかき忘れかな?と思ったのですが、ちがうようです。
この場合、{ }があるのと無いのとではどのような違いがあるのですか?教えて下さい。
よろしくお願いします。

[E-Mail] 2002/07/15(月) 15:44:02
> char sz[_MAX_PATH+1], *lpsz ;

この変数が {} でくくられた範囲でのみ有効となりますので
明示的に「ここからここまでで、閉じた処理」としたい場合に
このような記述をする人もいるようです。

もっと上手い説明がありましたら他の方お願いします。

フマキラー 2002/07/15(月) 15:45:08
僕も見たことはあるけど自分ではほとんど使わないので
知ってる知識だけ言うと
{}でくくった部分はブロックといって、
変数の寿命はブロック内。
つまりこの場合、ブロック内で宣言されている
char sz[_MAX_PATH+1], *lpsz;
の寿命は、ブロック内まで。
ブロックの外に出ると寿命は切れてます。

どんなメリットがあるかは、もっと詳しい人フォローお願いしマース。
#とりあえず見やすくなる(?)かな
#
# switch(i)
#  {
#  case 0:
#   {
#      int = 0;
#   }
#  }
#こんなのができるし・・・

フマキラー 2002/07/15(月) 15:47:45
ごめんなさい
switch(abc)
{
 case 0:
    {
       int i = 0;
     }
}
こうの間違いです

ナオーバ 2002/07/15(月) 15:56:13
こんにちは
詳しいことはわからないのですが

    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 );
}
こんなことが出来ます。
デバック時に変数名がダブってるときに使ったくらいですが。

くたくた 2002/07/15(月) 17:05:50
>{ }があるのと無いのとではどのような違いがあるのですか?
最適化に影響します。具体的には、オプティマイザに最適化しやすくするヒントを与えます。

例えば、{}で寿命をなるべく短く設定すれば、そのブロック内の変数に割り当てられていた
レジスタが早い段階で解放されます。すると、それをいち早く他用途に当てる事ができます。

ただ、私の場合は
「名前のバッティングを気にせずデバッグコードを書きたい時に使う」
事が多いです。

私は デバッグ用コードを短い変数名(i等)で書く事が多い為、すぐに正規コードの変数名
(ループカウンタ等)とバッティングします。それを避ける為に{}でバリヤをはります。
デバッグ完了後も、コード削除範囲が分かりやすいという利点もあります。

とおりすがり 2002/07/16(火) 00:30:33
これは?
http://member.nifty.ne.jp/yamazaki/doc_data01.html

ベホマラー 2002/07/16(火) 10:17:27
[[解決]]
みなさまからたくさんのレスを頂き、誠に感謝いたします。
気になっていたことが解消され、非常に勉強になりました。
お教え頂いたホームページも大変参考になりました。ありがとうございます。
そして、こういった有用な掲示板を提供・運営されておられます管理人様にも
感謝したいと思います。

古いスレッドには追加発言できません。