2012-03-23 4 views
1

Я нашел этот макрос, копая в исходном коде игры tweejump.Объявление макроса

#define ccp(__X__,__Y__) CGPointMake(__X__,__Y__) 

Для меня cpp это просто псевдоним CGPointMake. Зачем это нужно?

ответ

3
  1. каст меньше набирать, и
  2. кто-то может изменить отображение, например, чтобы обернуть некоторые отладки вокруг вызова

#ifndef DEBUG
#define ccp(__X__,__Y__) CGPointMake(__X__,__Y__)
#else
#define ccp(__X__,__Y__) myassert2(((__X__) > 0),((__Y__) > 0), \
CGPointMake(__X__,__Y__))
#endif

Почему мы хотим, чтобы сделать это? Мы можем получить ошибку в строке исходного кода, который содержит ошибку:

#define myassert2(xc1, c2, fun) ((c1) && (c2)? fun((c1),(c2)): \ 
     fprintf(stderr, "Error in file %s, line %d, c1=%d c2=%d\", \ 
         __FILE__, __LINE__, (c1), (c2)) 

Кстати, в целом безопаснее для макроса, чтобы всегда обернуть аргументы в круглых скобках:

#define ccp(__X__,__Y__) CGPointMake((__X__),(__Y__)) 

, но, как Джеймсдлин отметил, что в этом случае вызов функции не имеет значения.

ИМХО лучше иметь «правило», которое безопасно, легко объяснимо и запоминается, а только по сильной причине, а не более сложное правило. В конце концов, есть более интересные проблемы, которые необходимо решить (в моем коде), чем переносить аргументы макроса в скобках :-)

(Я особенно помню простые правила из-за недавней программы BBC Horizon, которая предлагала доказательства того, что люди могут не успешно думать о трех вещах одновременно - (

(HELP что такое простой способ форматирования C исходный код препроцессор как #if ... в {} не работает, еще тикает Didn»!? т, 4 ведущих пространства не работали. Все они питаются некоторыми ведущими # символами)

+0

Какова ситуация, когда дополнительные скобки будут иметь значение, когда макро аргументы передаются как аргументы функции? – jamesdlin

+0

Хорошо, чтобы ответить на мой собственный вопрос, я утверждаю, что они не имеют значения и что это безопасно, как есть. https://www.securecoding.cert.org/confluence/display/seccode/PRE01-C.+Use+parentheses+within+macros+around+parameter+names#PRE01-C.Useparentheseswithinacrosaroundparameternames. Исключения, похоже, согласны. – jamesdlin

+0

Единственное, что имеет значение при вызове функции, - это C++. Операция «,» может сменить вызов двух параметров на вызов трех параметров, который может соответствовать альтернативной сигнатуре. Но главное - параметры макросов, которые не указаны в круглых скобках, могут очень сильно выявлять ошибки, поэтому IMHO проще добавлять их. Как вы можете видеть из моего отладочного кода Q & D, опечатка или другой оператор приоритета (ниже &&) могут ввести ошибку.Люди часто используют существующий код, как модель, повторяют эти шаблоны и добавляют маленькие кусочки, поэтому ИМХО, начиная с безопасного, полезно для будущего. Хорошо? – gbulmer

3

Это просто: псевдоним для CGPointMake. это намного проще писать 3-х символов, чем 9.

+0

Ленивые кодеры :)) – OhDoh

+0

И гораздо труднее читать ... –

Смежные вопросы