2013-09-10 4 views
7

Я использую проект с открытым исходным кодом (NSBKeyframeAnimation) для некоторых анимаций в моем p-проекте. Вот пример методов, которые я использую:Необязательная модификация и доступ к параметру

double NSBKeyframeAnimationFunctionEaseInQuad(double t,double b, double c, double d) 
{ 
    return c*(t/=d)*t + b; 
} 

Я обновил свой Xcode до 5,0, и каждый метод этого проекта начал показывать мне предупреждения, как это: «Unsequenced модификации и доступа к«т '". Должен ли я переписать все методы объективному-c или есть другой подход, чтобы избавиться от всех этих предупреждений?

ответ

15

Поведение выражения c*(t/=d)*t + b является неопределенными, и вы должны это исправить, например в

t /= d; 
return c*t*t + b; 

Смотрите, например Undefined behavior and sequence points для подробного объяснения.

+0

спасибо, любая идея, почему это предупреждение не появится в предыдущих версиях Xcode? – ignotusverum

+1

@ anonymous: Я не могу вам сказать, но структура компилятора LLVM постоянно улучшается. –

5

эти предупреждения могут быть отключены

поставить это перед кодом запуска предупреждение

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wunsequenced" 

и это после того, как этот код

#pragma clang diagnostic pop 

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

Я благодарен за эти функции, но программист должен понимать, что попытка написать все на одной строке очень «1980-е», когда компиляторы не были так же оптимизированы, как сегодня.

и когда на самом деле важно выиграть несколько процессорных циклов, у нас осталось всего несколько миллионов, а не миллиарды, которые у нас есть сейчас.

Я всегда ставил бы читаемость в первую очередь.

+0

Незначительная точка: Написание всего на одной линии НЕ более эффективно. Даже в 80-е годы это не имело большого значения. –

+0

в восьмидесятые годы, написавшие ++ или a = a + 1, не генерировал тот же код. –

+0

Но были случаи, когда 'a ++' был на самом деле медленнее. –

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