2012-11-06 50 views
0

我正在寫一個應用程序的帽子將使用大多數的形式相同形式的默認設置,所以我決定宏WNDCLASSEX並在需要時調用它:的#define - 預期和表達C++

#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

我嘗試內聯函數,但它說「沒有適合的構造函數存在將WNDCLASSEX *轉換爲tagWNDClASSEXW」 –

回答

4

預處理宏是而不是函數。在你的代碼中看到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; 
}