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 回答