C++ 使用第一个宏的参数将宏转换为另一个宏

C++ 使用第一个宏的参数将宏转换为另一个宏,c++,macros,c-preprocessor,C++,Macros,C Preprocessor,我正在努力使这个宏工作: #define InitProperty(Name, Type) DefineMethods ( ##Name.Mode, Type, Name ) 现在这似乎不起作用了这让我: DefineMethodsLenght.Mode(caller, Lenght) 而不是 DefineMethods(Lenght.Mode, caller, Lenght); 这里发生了什么;这难道不可能吗?如果你想要你说想要的结果,那么你不需要使用任何预处理操作符;你只需要: #d

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

#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
是两个预处理令牌--
Lenght
--不是一个。

我认为

#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);
模板
void InitProperty(TName名称,TType类型){
定义方法(名称、模式、类型、名称);
}
InitProperty(长度、调用方);

如果“Name”、“Type”也不是宏。

那么,您问题的标题意味着涉及两个宏,但您的示例仅显示一个宏。因此,我继续猜测您有:

#define InitProperty(Name, Type) DefineMethods ( Name.Mode, Type, Name )
#define DefineMethods(Name, Type, Arg)  DefineMethods##Name( Type, Arg )
现在如果你用

InitProperty(Lenght, caller)
您将获得(宏扩展后)

这就是你描述的,你说你想要的

DefineMethods(Lenght.Mode, caller, Lenght)

它确实存在于宏扩展过程的中间,但是在扩展DefineMethods宏之后,您将看到您所看到的。如果这不是您想要的,问题在于DefineMethods宏而不是InitProperty宏,但是由于您在问题中没有显示它,我们无法真正说明发生了什么。

谢谢您的回答,但是我实际上给出了相同的结果?@Richard:使用我显示的宏,
InitProperty(Lenght,caller)
的结果应该是
DefineMethods(Lenght.Mode,caller,Lenght)“如果你得到不同的结果,你的编译器就坏了。”杰姆斯:我正在使用VisualStudio 2008,奇怪的是,它不应该是应该的。我会给2010点一个,也许他们会修复它。@李察:Visual C++ 2008给出了我所指示的结果。你做了其他错误的事情,但是没有办法知道你的信息是什么。给定。如果将此宏定义和调用放入名为
test.cpp
文件中,运行
cl/P test.cpp
,然后查看生成的
test.i
文件,您将看到预期结果。
DefineMethods(Lenght.Mode, caller, Lenght)