
よろしくお願いします。
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ウィンドウサイズを変更しても...
-
ボタンの色(WINAPI)
-
Win32APIでウィンドウを中央に...
-
最早開始時間と最遅完了時刻を...
-
Aの値からBの値を除するとは??
-
信頼区間の1.96や1.65ってどこ...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
値差の%計算方法について
-
数字以外が入力されたらエラー...
-
「Aに対するBの割合」と「Aに対...
-
VB6.0での小数点の扱いについて
-
【C++】関数ポインタの使い方
-
c languageで 簡単な質問があ...
-
ある商品のロス率を5%見込み、...
-
既定のコンストラクタがありま...
-
CTabCtrl:TABインデックス単位...
-
charと%c , %s の関係について
-
ExcelでPC(パソコン)によって...
-
数学 一次関数 関数 y=-3/4x+k(...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エディットボックスの背景の色...
-
エラー Run-Time Check Failur...
-
Win32APIでウィンドウを中央に...
-
ウィンドウサイズを変更しても...
-
音量調節
-
1~1000,1001~2000の間に素数が...
-
この列挙体でsysjanの関数はあ...
-
子ウインドウの作成と破棄について
-
Win32のファイルダイアログのサ...
-
ウィンドウ非表示に時に表示し...
-
COMPORTマルチスレッドで例外発生
-
ボタンの色(WINAPI)
-
マウスの反応
-
ポップアップメニュー
-
C言語win32api、エディットボッ...
-
ウィンドウが表示されない
-
WM_CREATE について
-
c言語のプログラミングでキーボ...
-
C++のcase文の書き方
-
LoadImageとSetCursorについて
おすすめ情報