[英]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.