我正在写一个应用程序帽子,它将在大多数表单上使用相同的表单默认值,因此我决定对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

想法/看不出为什么会发生他的错误。 :/

最佳答案

预处理程序宏不是函数。当预处理程序看到MainLoaderWnd在您的代码中被“调用”时,所执行的操作是用宏主体中的文本替换“call”。这意味着您的分配将如下所示:

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;
}

关于c++ - #define-期望和表达式C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13253033/

10-10 05:51