
よろしくお願いします。
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 行目 }
No.2ベストアンサー
- 回答日時:
※ ANo.1 の回答者の方が回答されておられるので蛇足にしかなりませんが。
> warning C4715
このような警告は、条件処理で「return 戻り値」とする場合において、条件以外の処理となった場合に
関数からの戻り値を返さない記述がされていると発生します。
例としては以下のような場合があります。
コンパイラの警告 (レベル 1) C4715 (C++)
http://msdn2.microsoft.com/ja-jp/library/6deaf4k …
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;
}
いかなる条件でも関数が値を返すよう記述されるていると警告が避けられます。
丁寧なアドバイス有難うございます。
色々と試していたため、御礼が遅れてしまいました。
無事に警告を消すことが出来ました。プログラム的には、まだ完成してはいないのですが、これで先に進むことが出来ます。
No.1
- 回答日時:
switch(msg)の
case WM_RBUTTONDOWN:
case WM_COMMAND:
などから 戻る際の返り値が無いためです
処理した場合 0を返すような return 0; を NewProcの最後にでも記述してください
普通は 独自プロシージャの最後に 処理しなかったメッセージに対し
return DefWindowProc( hWnd, msg, wParam, lParam );
と言った記述をし default:を省略するほうが多いように思います
回答有難うございます。
色々と試していたため、御礼が遅れてしまいました。
警告は、無事に消すことが出来ました。
また、処理をしない時の記述も参考にしたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript jsで、switch文で書かれた分をif文にできませんか。 1 2022/07/28 15:10
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ダイアログプログラムでEnterキ...
-
WM_CREATE について
-
C言語win32api、エディットボッ...
-
ウィンドウ非表示に時に表示し...
-
WM_INITDIALOGのフック
-
DirectShowを用いたmpgファイル...
-
エラー Run-Time Check Failur...
-
VC++2005での警告について教え...
-
エディットコントロール入力時...
-
アイコンを左上に表示したい
-
エディットボックスの背景の色...
-
Win32のファイルダイアログのサ...
-
Win32APIでウィンドウを中央に...
-
「指定されたキャストは有効で...
-
Excelで1つしかない値だけを抽...
-
Aの値からBの値を除するとは??
-
信頼区間の1.96や1.65ってどこ...
-
関数とビット列
-
テキストデータをそのままバイ...
-
C言語の型による処理速度の違い
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エディットボックスの背景の色...
-
ウィンドウ非表示に時に表示し...
-
エラー Run-Time Check Failur...
-
Win32APIにて、ウィンドウ全体...
-
ボタンの色(WINAPI)
-
ダイアログプログラムでEnterキ...
-
C#のswitch文を簡略化したいの...
-
オーバーレイみたいな処理がしたい
-
Win32APIでウィンドウを中央に...
-
プログラミングでエラーが出ま...
-
ツリーコントロールの開閉アイ...
-
なぜhButton1ボタンからのWM_CO...
-
C言語win32api、エディットボッ...
-
LoadImageとSetCursorについて
-
コンソールアプリケーションの...
-
画像を表示したいのですが……
-
MoveToExとLineToについて
-
ウィンドウのサイズ変更について
-
ボタンのアイコン表示
-
トラックのループの仕方
おすすめ情報