从第一个宏的参数宏到另一个宏

时间:2010-12-26 10:01:01

标签: c++ macros c-preprocessor

我正在努力让这个宏工作:

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

现在这似乎不起作用这让我:

DefineMethodsLenght.Mode(caller, Lenght) 

而不是

DefineMethods(Lenght.Mode, caller, Lenght);

这里发生了什么;这不可能吗?

3 个答案:

答案 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);

如果“名称”,“类型”也不是宏。