0

ほとんどのフォームで同じフォームの既定値を使用するアプリケーションを作成しているので、WNDClASSEX をマクロ化し、必要に応じて呼び出すことにしました。

#pragma once

#ifndef WNDCLASSEX_H
#define WNDCLASSEX_H

#include <windows.h>

//MAIN FORM / LOADER WNDCLASSEX
#define MainLoaderWnd(Size, WindowsProcess, hInstance, Title)\
{\
    return new WNDCLASSEX{\
    size,\
    CS_DBLCLKS,\
    WindowsProcess,\
    0,\
    0,\
    hInstance,\
    LoadIcon(NULL, IDI_APPLICATION),\
    LoadCursor(NULL, IDC_ARROW),\
    (HBRUSH)(COLOR_WINDOW),\
    NULL,\
    L(Title),\
    LoadIcon(NULL, IDI_APPLICATION)\
};\
}

#endif

ただし、これをファイル「loader.cpp」に追加すると、次のようになります。

WNDCLASSEX wcex = MainLoaderWnd(sizeof(WNDCLASSEX), WndProc, hInstance, L"Your Text Here");
//Intellisense error: Expression Expected

アイデア/彼のエラーが発生する理由がわかりません。:/

4

1 に答える 1

4

プリプロセッサ マクロは関数ではありませんMainLoaderWndコードで「呼び出された」ことを確認したときにプリプロセッサが行うことは、「呼び出し」をマクロ本体のテキストに置き換えることです。これは、割り当てが次のようになることを意味します。

WNDCLASSEX wcex = { return new WNDCLASSEX{ ... }; }

これは有効な割り当てではありません。

inline代わりに、適切な関数のような関数を作成できますが、コンパイラ (プリプロセッサではない) は生成されたコードを呼び出しの場所にインラインで配置する場合があります。

//MAIN FORM / LOADER WNDCLASSEX
inline PWNDCLASSEX MainLoaderWnd(size_t Size, WNDPROC WindowsProcess,
                                 HINSTANCE hInstance, LPTSTR Title)
{
    PWNDCLASSEX cls = new WNDCLASSEX;

    // Set the fields

    return cls;
}
于 2012-11-06T14:41:55.303 に答える