Макрос к другому макросу с аргументами из первого макроса - PullRequest
2 голосов
/ 26 декабря 2010

Я пытаюсь заставить этот макрос работать:

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

Теперь, похоже, это не работает, меня это выводит:

DefineMethodsLenght.Mode(caller, Lenght) 

вместо

DefineMethods(Lenght.Mode, caller, Lenght);

Что здесь происходит;разве это не возможно?

Ответы [ 3 ]

2 голосов
/ 27 декабря 2010

Ну, название вашего вопроса подразумевает, что в нем задействованы ДВА макроса, но в вашем примере показан только один макрос. Поэтому я пойду вперед и угадаю, что у вас есть:

#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 голосов
/ 26 декабря 2010

Если вы хотите получить результат, который вы говорите, то вам не нужно использовать никаких операторов предварительной обработки; вам просто нужно:

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

Оператор ## используется для объединения токенов. Учитывая ваше текущее определение макроса, я не понимаю, почему вы получите результат, который, как вы говорите, вы получите, но использование ## определенно неверно. Результатом объединения должен быть один токен предварительной обработки, а (Lenght - это два токена предварительной обработки - ( и Lenght - не один.

0 голосов
/ 26 декабря 2010

Я думаю

#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);

Если «Имя», «Тип» также не являются макросами.

...