Макросы обрабатываются первыми и работают с исходным кодом в виде простого текста.Так что да, вы можете сделать так, чтобы ваш макрос new
генерировал синтаксис Objective-C или простой синтаксис C, или даже недопустимый синтаксис, если хотите.
Недостатки использования макроса в целом таковы, потому что он анализируется иобработанный на отдельном шаге, можно написать макросы, которые не ведут себя так, как вы ожидаете, даже когда все выглядит хорошо.
Например, этот макрос:
#define MAX(x,y) x > y ? x : y
выглядит хорошо, носкажем, вы использовали это так:
z = MAX(a,MAX(b,c));
Это будет расширено препроцессором во что-то вроде этого:
z = a > b > c ? b : c ? a : b > c ? b : c;
Что на самом деле не даст вам максимум трех аргументов,Чтобы решить эту проблему, вам нужно обильно посыпать круглые скобки в определении макроса, даже если вы не думаете, что это необходимо:
#define MAX(x,y) ((x) > (y) ? (x) : (y));
Это исправляет это, за исключением того, что я добавил точку с запятой в конец, что являетсяПонятная привычка писать много кода на C, за исключением того, что теперь наш макрос расширяется до:
z = ((a) > (((b) > (c) ? (b) : (c));) ? (a) : (((b) > (c) ? (b) : (c));));;
Синтаксические ошибки!
Если вы посмотрите, как на самом деле определено MAX
в Objective-CЭто довольно беспорядок, но это то, что вы должны сделать, чтобы безопасно писать макросы.И вам также нужно учитывать, что:
z = MAX(expensiveComputation(), reallyExpensiveComputation())
, в отличие от функции, будет фактически выполнять одну из этих функций дважды , если только вы не используете трюк в макросе для эмуляции передачи параметров.
Итак, чтобы ответить на ваш вопрос, да, это вполне возможно, но написать безопасные макросы действительно сложно.И вы делаете это, чтобы вы могли притвориться, что ваш код Objective C фактически является кодом на другом языке ... В любом случае, зачем вам это нужно?