我正在努力让这个宏工作:
#define InitProperty(Name, Type) DefineMethods ( ##Name.Mode, Type, Name )
现在这似乎不起作用这让我:
DefineMethodsLenght.Mode(caller, Lenght)
而不是
DefineMethods(Lenght.Mode, caller, Lenght);
这里发生了什么;这不可能吗?
答案 0 :(得分:2)
如果你想要你想要的结果,那么你不需要使用任何预处理运算符;你只需要:
#define InitProperty(Name, Type) DefineMethods ( Name.Mode, Type, Name )
##
运算符用于连接标记。鉴于你当前的宏定义,我不明白为什么你会得到你说的结果,但你使用##
肯定是不正确的。连接的结果必须是单个预处理标记,(Lenght
是两个预处理标记 - (
和Lenght
- 而不是一个。
答案 1 :(得分:2)
嗯,你的问题的标题意味着涉及两个宏,但你的例子只显示一个宏。所以我会继续猜猜你有:
#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宏,但是因为你没有在你的问题中显示它,我们无法确切地知道发生了什么。
答案 2 :(得分:0)
我认为
#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);
如果“名称”,“类型”也不是宏。