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