MFC ON_COMMAND の &

[戻る]
nakatsuka 2007/02/14(水) 12:18:46
久しぶりにプログラムを作ろうとMFCでメニューにコマンドを登録して
はじめたときに BEGINマクロの中のON_COMMANDマクロの中に&があるのに気づきました。

ON_COMMAND(ID_MNU_IDFile, &CMainFrame::OnMnuIdfile)
VC8(VisualStudio2005です)

昔はVC6でやっていた経験しかないのですが &は無かったような記憶があり
確認したところ&は付いていませんでした。

何か変わったんでしょうか?

Blue 2007/02/14(水) 13:17:58
C++言語で
関数名に&をつけない場合、暗黙的につけたものとして関数ポインタを取得するのだった
ような。
だから、明につけるようにしたとか。
(関数ポインタを使うときも*をつけないと暗黙的につけたものとみなすとか。)
# 詳しいことはC++の規格書をよまないとなぁ。

その真意はMicrosoftに聞かないと確かではないでしょうけど。

#include <iostream>

void Hoge(){ std::cout << "Hoge()" << std::endl; }

int main()
{
    void (*h)();

    h = Hoge;
    (*h)();

    h = &Hoge;
    h();

    return 0;
}

tetrapod 2007/02/14(水) 13:22:15
VS2005 は使ってないけど理由は推測できるな

VC++6 の頃は C++ 言語規格書がまだ策定中で採択されてなかった
つまり VC++6 は言語規格書より古い=規格合致でないわけだ。
VS2005 は規格合致をうたってるので、規格書にしたがうよう修正された。

採択された ISO/IEC 14882:1998 には以下のようなことが書いてある。
5.3.1 Unary operators 3
メンバ関数へのポインタが生成されるのは明示的に & を使用したときだけとする

ON_*** がメンバ関数へのポインタを使っていることを VC++ を使うプログラマに
知らしめるためには **.cpp ソースコード上で & を明示させるほうがよい、
と判断したんだろう。
VC++6 の AFXMSG_.H は & を ON_*** マクロ中で使うことで **.cpp 上では
& を隠蔽してるんだけど、それでは良くないと思ったんだろうな。

正確なところは Microsoft の中の人に聞かなきゃわからん。

nakatsuka 2007/02/14(水) 13:42:37
[[解決]]
仕様に従ったためなんですね、了解しました。
Blueさん、tetrapod さん有難うございました。

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