簡體   English   中英

宏到另一個宏,帶有第一個宏的參數

[英]Macro to an other macro with arguments from first macro

我正在嘗試使此宏工作:

#define InitProperty(Name, Type) DefineMethods ( ##Name.Mode, Type, Name )

現在,這似乎不起作用,這讓我:

DefineMethodsLenght.Mode(caller, Lenght) 

代替

DefineMethods(Lenght.Mode, caller, Lenght);

這里發生了什么; 這不可能嗎?

如果您要獲得想要的結果,則無需使用任何預處理運算符。 您只需要:

#define InitProperty(Name, Type) DefineMethods ( Name.Mode, Type, Name )

##運算符用於連接令牌。 給定您當前的宏定義,我不明白為什么會得到您說得到的結果,但是您對##的使用絕對不正確。 級聯的結果是必需的是一個單一的預處理標記,和(Lenght是二預處理tokens-- (Lenght --not之一。

好吧,您的問題的標題意味着涉及兩個宏,但是您的示例僅顯示一個宏。 因此,我繼續猜測您有:

#define InitProperty(Name, Type) DefineMethods ( Name.Mode, Type, Name )
#define DefineMethods(Name, Type, Arg)  DefineMethods##Name( Type, Arg )

現在,如果您使用

InitProperty(Lenght, caller)

您將獲得(宏擴展后)

DefineMethodsLenght.Mode(caller, Lenght)

這就是你所描述的。 你說你要

DefineMethods(Lenght.Mode, caller, Lenght)

確實存在於宏擴展過程的中間,但是在擴展DefineMethods宏之后,您將獲得所看到的內容。 如果這不是您想要的,那么問題出在DefineMethods宏中,而不是InitProperty宏中,但是由於您沒有在問題中顯示它,因此我們無法真正知道發生了什么。

我認為

#define InitProperty(Name, Type) DefineMethods ( Name.Mode, Type, Name )

應該是正確的。 但是為了安全起見,最好使用:

#define InitProperty(Name, Type) DefineMethods ( (Name).Mode, (Type), (Name) )

如果問題仍然存在,為什么不試試呢?

template<TName, TType>
void InitProperty(TName Name, TType Type) {
    DefineMethods (Name.Mode, Type, Name);
}

InitProperty(Length, caller);

如果“名稱”,“類型”也不是宏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM