>>294
> 無駄は生じないというのは・・・

変数宣言に対して「実行する」とか「何回実行する」という考え方を捨てて下さい。宣言は、ただ宣言するだけであって、何も実行しません。
制御がその部分を通過するかどうか、まったく関係ありません。

> 最適化で消えて無くなる

つまり
const char* str = "abc";
TextOut(hDC,0,0,str,3);
これは
TextOut(hDC, 0, 0, "abc", 3);
になるだろう、ということです。まぁこれに関しては最適化の度合いにも依るんで、一概には言えませんが。


んで、ですね。本題(なのか?)に入ると、

> case WM_CREATE:
>  HDC hDC;
>  PAINTSTRUCT ps;
>  char *str = "abc";
> break;
> case WM_PAINT:
>  hDC = BeginPaint(hWnd, &ps);
>  TextOut(hDC,0,0,str,3);
>  EndPaint(hWnd, &ps);
> break;

これですが、ダメです。
str は WM_CREATE を最初に通ったときに "abc" で初期化されますが、関数 WndProc を抜けたときに消え去ります。
次に WndProc に来たときには、str は前の値を覚えていません。
WM_PAINT を受け取ると、switch-caseのジャンプで飛び越されるため str は初期化されずゴミ値になります。