Я нашел этот макрос, копая в исходном коде игры tweejump.Объявление макроса
#define ccp(__X__,__Y__) CGPointMake(__X__,__Y__)
Для меня cpp это просто псевдоним CGPointMake. Зачем это нужно?
Я нашел этот макрос, копая в исходном коде игры tweejump.Объявление макроса
#define ccp(__X__,__Y__) CGPointMake(__X__,__Y__)
Для меня cpp это просто псевдоним CGPointMake. Зачем это нужно?
#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 ведущих пространства не работали. Все они питаются некоторыми ведущими #
символами)
Это просто: псевдоним для CGPointMake
. это намного проще писать 3-х символов, чем 9.
Ленивые кодеры :)) – OhDoh
И гораздо труднее читать ... –
Какова ситуация, когда дополнительные скобки будут иметь значение, когда макро аргументы передаются как аргументы функции? – jamesdlin
Хорошо, чтобы ответить на мой собственный вопрос, я утверждаю, что они не имеют значения и что это безопасно, как есть. https://www.securecoding.cert.org/confluence/display/seccode/PRE01-C.+Use+parentheses+within+macros+around+parameter+names#PRE01-C.Useparentheseswithinacrosaroundparameternames. Исключения, похоже, согласны. – jamesdlin
Единственное, что имеет значение при вызове функции, - это C++. Операция «,» может сменить вызов двух параметров на вызов трех параметров, который может соответствовать альтернативной сигнатуре. Но главное - параметры макросов, которые не указаны в круглых скобках, могут очень сильно выявлять ошибки, поэтому IMHO проще добавлять их. Как вы можете видеть из моего отладочного кода Q & D, опечатка или другой оператор приоритета (ниже &&) могут ввести ошибку.Люди часто используют существующий код, как модель, повторяют эти шаблоны и добавляют маленькие кусочки, поэтому ИМХО, начиная с безопасного, полезно для будущего. Хорошо? – gbulmer