#define - Expected和Expression C ++

时间:2012-11-06 14:24:02

标签: c++ winapi syntax-error

我正在编写一个应用程序hat将在大多数表单上使用相同的表单默认值,所以我决定将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

想法/无法理解他的错误发生的原因。 :/

1 个答案:

答案 0 :(得分:4)

预处理器宏一个函数。预处理器在代码中看到MainLoaderWnd被“调用”时所执行的操作是用宏体中的文本替换“调用”。这意味着您的作业将如下所示:

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

这不是有效的作业。

相反,你可以创建一个inline函数,它就像一个正确的函数,但编译器(不是预处理器)可能会将生成的代码内联放在调用的位置:< / p>

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