• ベストアンサー

VC++2005での警告について教えてください

よろしくお願いします。 vc++2005を使ってコンパイルした時、プログラムの『691行目と、689行目』の所に緑色の(∥チェック)が付いていて、次のような警告が出たのですが、 これは、『記述する場所が間違っている』と解釈して良いでしょうか? ------ ビルド開始: プロジェクト: memo, 構成: Release Win32 ------ コンパイルしています... c:\memo\memo\memo.cpp(691) : warning C4715: 'NewProc' : 値を返さないコントロール パスがあります。 コード生成が終了しました。 マニフェストを埋め込んでいます... ビルドログは "file://c:\Visual Studio 2005\Projects\memo\memo\Release\BuildLog.htm" に保存されました。 memo - エラー 0、警告 21 ========== ビルド: 1 正常終了、0 失敗、0 更新、0 スキップ ========== //サブクラス化後のプロシージャ LRESULT CALLBACK NewProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { POINT pt; static HMENU hMenu; static HMENU hSubMenu; int id; switch (msg){ case WM_RBUTTONDOWN: //ポップアップメニューを作る hMenu = LoadMenu(hInst, "MYMENU2"); hSubMenu = GetSubMenu(hMenu, 0); pt.x = LOWORD(lp); pt.y = HIWORD(lp); ClientToScreen(hWnd, &pt); TrackPopupMenu(hSubMenu, TPM_LEFTALIGN, pt.x, pt.y, 0, hWnd, NULL); DestroyMenu(hMenu); break; case WM_COMMAND: switch (LOWORD(wp)){ case IDM_NEW: MyNew(hWnd); break; /*case IDM_SAVE: MySave(hWnd); break;*/ case IDM_SAVEAS: MySaveAs(hWnd); break; case IDM_OPEN: MyOpen(hWnd); break; case IDM_END: if(SendMessage(hWnd, EM_GETMODIFY, 0, 0) == FALSE){ id = MessageBox(hWnd, TEXT("終了してもいいですか"), TEXT("確認"), MB_YESNO | MB_ICONQUESTION); if(id == IDYES){ DestroyWindow(hWnd); PostQuitMessage(0); } } if(SendMessage(hWnd, EM_GETMODIFY, 0, 0) == TRUE){ id = MessageBox(hWnd, TEXT("文書が更新されています、\n変更を保存しますか?"), TEXT("メモ帳"), MB_YESNOCANCEL | MB_ICONEXCLAMATION); if(id == IDYES){ MySave(hWnd); //MySaveAs(hWnd); }else if (id == IDCANCEL){ return IDCANCEL; }/*else if (id ==IDNO){ *///ここを記述すると //文書保存ダイアログでキャンセルした時に、『終了しない』 id = MessageBox(hWnd, TEXT("終了してもいいですか"), TEXT("確認"), MB_YESNO | MB_ICONQUESTION); if(id == IDYES){ DestroyWindow(hWnd); PostQuitMessage(0); } } } break; default: 689行目 return CallWindowProc(OldProc, hWnd, msg, wp, lp); } 691 行目 }

質問者が選んだベストアンサー

  • ベストアンサー
  • x415f484f
  • ベストアンサー率71% (57/80)
回答No.2

※ ANo.1 の回答者の方が回答されておられるので蛇足にしかなりませんが。 > warning C4715 このような警告は、条件処理で「return 戻り値」とする場合において、条件以外の処理となった場合に 関数からの戻り値を返さない記述がされていると発生します。 例としては以下のような場合があります。 コンパイラの警告 (レベル 1) C4715 (C++) http://msdn2.microsoft.com/ja-jp/library/6deaf4k9(VS.80).aspx if で合致しない値になった時に、関数からの値を返さないもの int func(int arg) {  if(arg == ID_A)  {   return 1;  }  else if (arg == ID_B)  {   return 2;  } } switch ~ case で合致しない値となった時に、関数からの値を返さないもの int func(int arg) {  switch(arg)  {  case ID_A:   return 1;   break;  case ID_B:   return 2;   break;  } } 対処としては条件値と合致しない場合にも関数からの戻り値を返すようにします。(if の場合の記述は省略) int func(int arg) {  switch(arg)  {  case ID_A:   return 1;   break;  case ID_B:   return 2;   break;  default:   return 0;   break;  } } または int func(int arg) {  switch(arg)  {  case ID_A:   return 1;   break;  case ID_B:   return 2;   break;  }  return 0; } いかなる条件でも関数が値を返すよう記述されるていると警告が避けられます。

noname#220054
質問者

お礼

丁寧なアドバイス有難うございます。 色々と試していたため、御礼が遅れてしまいました。 無事に警告を消すことが出来ました。プログラム的には、まだ完成してはいないのですが、これで先に進むことが出来ます。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

switch(msg)の case WM_RBUTTONDOWN: case WM_COMMAND: などから 戻る際の返り値が無いためです 処理した場合 0を返すような return 0; を NewProcの最後にでも記述してください 普通は 独自プロシージャの最後に 処理しなかったメッセージに対し return DefWindowProc( hWnd, msg, wParam, lParam ); と言った記述をし default:を省略するほうが多いように思います

noname#220054
質問者

お礼

回答有難うございます。 色々と試していたため、御礼が遅れてしまいました。 警告は、無事に消すことが出来ました。 また、処理をしない時の記述も参考にしたいと思います。

すると、全ての回答が全文表示されます。

関連するQ&A