Как написать макрос, который может принимать параметр?

Я хочу использовать некоторые вещи NSAssert и другие вещи, чтобы улучшить отладку в моем приложении. NSAssert хочет строку, которую он печатает, если утверждение не выполняется. Красиво, но бесполезно, если вы не наберете в этой строке целую кучу информации, которая может стать большой неразберихой, если будет выполняться повсюду.

Итак, я хочу создать макрос, который будет выполнять вызов NSAssert со строкой, содержащей полезную информацию, такую ​​как имя класса, имя метода и другие вещи. Но что более важно, я хочу также предоставить собственный комментарий. Представьте себе такой макрос:

USEFUL_ASSERT (foo! = Nil, @ "это было не очень хорошо")

по многим причинам я не могу использовать здесь вызов функции или метода, потому что контекст будет потерян, и я не смогу узнать, какой класс вызвал эту проблему, какой метод вызвал эту проблему. Это можно сделать только внутри самого метода, поэтому мне пришлось бы передать множество параметров для этой информации, таких как [self class] и _cmd, но я не хочу, чтобы все это было разбросано повсюду. Чем короче код для вставки, тем лучше его поддерживать.

Любая идея?


person Community    schedule 03.09.2009    source источник
comment
Вы сделали RTFM? (обычно не в моем стиле, но, в конце концов, это ваше имя пользователя)   -  person Barry Wark    schedule 04.09.2009
comment
человек. TFM настолько велик, что я все время читаю. но мне нужно еще шесть лет, пока я все не пройду. Поэтому я пытаюсь ускорить процесс обучения с помощью SO.   -  person    schedule 04.09.2009


Ответы (2)


Ознакомьтесь с документами по макросам.

person Ken    schedule 03.09.2009

person    schedule
comment
Хорошо, похоже, я мог бы просто использовать условие, комментарий в определении макроса? я попробую это! идеально. - person ; 04.09.2009
comment
Просто помните, что это текстовая замена, а не привязка переменных, поэтому, например, если вы напишете USEFUL_ASSERT(++x == 0, @"It's zero"), это означает, что x будет увеличиваться при каждом появлении condition в теле макроса. - person Chuck; 04.09.2009
comment
Так, например, если тело макроса NSLog(@"%u is true? %@", (condition), (condition) ? @"YES" : @"NO"), оно расширяется до NSLog(@"%u is true? %@", (condition), (condition) ? @"YES" : @"NO"). Обратите внимание, что здесь есть два ++x выражения, поэтому x увеличивается вдвое. - person Peter Hosey; 04.09.2009
comment
Имеет большой смысл. Грасиас! - person ; 04.09.2009