Однострочное исключение для GCC_WARN_SHADOW = YES?

У меня есть этот код:

id error;
// a bunch of stuff, including using error
Finalization finalization = ^(int status) {
    id error; // <--- Declaration shadows a local variable
    // a bunch of stuff, using error
}
// a bunch of stuff, using error

Я использую GCC_WARN_SHADOW, потому что это то, что я хочу в каждом случае в моем коде, кроме этого. В этом случае он дает мне предупреждение, которое я хочу подавить.

Есть ли способ подавить это одно теневое предупреждение, не отключая GCC_WARN_SHADOW или переименовывая внутреннюю ошибку во что-то другое? Какой-то способ отметить это объявление об ошибке?

Я использую clang с Xcode 4, если это имеет значение.


person Steven Fisher    schedule 09.05.2011    source источник
comment
Есть ли причина, по которой вы не можете переименовать внутренний error?   -  person Jonathan Grynspan    schedule 09.05.2011
comment
Нет, это было моим решением на данный момент. Но это немного неэлегантно, это означает, что любой код, перемещаемый изнутри наружу блока, должен быть изменен. В большинстве случаев это нормально, но, насколько я знаю, соглашение Cocoa для экземпляров NSError должно называться ошибкой, а не (например) error2 или finalizationError.   -  person Steven Fisher    schedule 09.05.2011
comment
Может быть, мне тоже следует пометить этот вопрос как педантичный? :)   -  person Steven Fisher    schedule 09.05.2011
comment
error является условным только потому, что редко можно найти лучшее название для ошибки. Также часто встречается :P e или более описательное имя переменной, такое как finalizationError.   -  person Jonathan Grynspan    schedule 09.05.2011


Ответы (1)


Во-первых, по моему мнению, скрывать локальную переменную во внутреннем блоке действительно плохая карма (достаточно плохо скрывать глобальную переменную в функции). Теперь «ошибка» может принимать два разных значения внутри функции, и пока тот, кто читает ваш код, не поймет это, он будет постоянно биться головой. Я видел эту проблему в реальной жизни среди платных профессионалов, разрабатывающих приложения. Я действительно предлагаю переименовать внутреннюю переменную ошибки.

Отвечая на ваш вопрос, вы можете использовать прагму компилятора GCC/clang для подавления предупреждение.

person Kevin Draz    schedule 10.03.2013
comment
Я не согласен с вашим мнением здесь, поскольку весь смысл в том, чтобы называть это одним и тем же, это одна и та же концепция. Какая ошибка не имеет значения, так как единственная причина, по которой вы бы использовали это, - это блоки GCD, где внешний error бесполезен для внутреннего кода. Но ваш ответ, конечно, правильный, и я думаю, что ваше мнение верно для большинства других переменных затенения. :) - person Steven Fisher; 11.03.2013