есть ли способ подавления предупреждений в xcode?

<p>есть ли способ подавления предупреждений в xcode?</p><p>например, я вызываю недокументированный метод и, поскольку метод отсутствует в заголовке, я получаю предупреждение при компиляции. я знаю, что могу добавить его в свой заголовок, чтобы остановить предупреждение, но мне интересно, есть ли другой способ, кроме добавления его в заголовок (чтобы я мог сохранить заголовки чистыми и стандартными), чтобы подавить предупреждение? прагма или что-то?</p>

<p>чтобы отключить предупреждения для каждого файла, используя xcode 3 и llvm-gcc-4.2, вы можете использовать:</p><pre><code>#pragma gcc diagnostic ignored "-wwarning-flag" </code></pre><p>где имя предупреждения - некоторый флаг предупреждения gcc.</p><p>это переопределяет все флаги предупреждения в командной строке. это не работает со всеми предупреждениями, хотя. добавьте -fdiagnostics-show-option к вашим cflags, и вы увидите, какой флаг вы можете использовать, чтобы отключить это предупреждение.</p>

<p>существует более простой способ подавления <strong> неиспользованных переменных </strong> предупреждений:</p><pre><code>#pragma unused(varname) </code></pre><p>правка: источник: <a href="http://www.cocoadev.com/index.pl?xcodepragmas">http://www.cocoadev.com/index.pl?xcodepragmas</a> </p><p>обновление: я столкнулся с новым решением, более надежным</p><ol> <li>откройте "проект"> "изменить активную цель"> вкладку "сборка".</li> <li>в поле <code>user-defined</code>: найдите (или создайте, если он не найден) ключ: <code>gcc\_warn\_unused\_variable</code> установите для него значение <code>no</code>.</li> </ol><p>правка-2 пример:</p><pre><code>bool ok = yes; nsassert1(ok, @"failed to calculate the first day the month based on %@", self); </code></pre><p>компилятор показывает предупреждение о неиспользуемой переменной для <code>ok</code>.</p><p>решение:</p><pre><code>bool ok = yes; #pragma unused(ok) nsassert1(ok, @"failed to calculate the first day the month based on %@", self); </code></pre><p>ps: вы также можете установить/сбросить другое предупреждение: <code>gcc\_warn\_about\_return\_type</code>: <code>yes/no</code></p>

<h2>для gcc вы можете использовать</h2><pre><code>#pragma gcc diagnostic push #pragma gcc diagnostic ignored "-wshadow-ivar" // your code #pragma gcc diagnostic pop </code></pre><p>вы можете узнать о <a href="http://gcc.gnu.org/onlinedocs/gcc/diagnostic-pragmas.html">прагма gcc здесь</a> и получить код предупреждения о предупреждении, перейдите в навигатор отчетов (command + 9), выберите самую верхнюю сборку, разверните журнал (кнопка '=' на справа) и прокрутите вниз, и там ваш код предупреждения находится в квадратных скобках, как это <code>[-wshadow-ivar]</code></p><h2>для лязга вы можете использовать</h2><pre><code>#pragma clang diagnostic push #pragma clang diagnostic ignored "-wshadow-ivar" // your code #pragma clang diagnostic pop </code></pre>

<p>чтобы исключить предупреждение для отдельного файла, сделайте следующее:</p><p>выберите файл в проекте xcode. нажмите get info, перейдите на страницу с параметрами сборки, введите -wno-, чтобы отменить предупреждение:</p><blockquote> <p>-wno-</p> </blockquote><p>например.</p><blockquote> <p>-wno-неиспользованный-параметр</p> </blockquote><p>вы можете получить название предупреждения, если вы посмотрите в настройках проекта, посмотрите предупреждения gcc, расположенные внизу вкладки сборки, щелкнув каждое предупреждение, оно сообщит вам имя параметра предупреждения:</p><p>например.</p><blockquote> <p>предупреждать всякий раз, когда параметр функции не используется, кроме его объявления. [gcc\_warn\_unused\_parameter, -wunused-параметр]</p> </blockquote>

<p>чтобы избавиться от предупреждения: попробуйте создать интерфейс категории для рассматриваемого объекта.</p><pre><code>@interface nstheclass (myundocumentedmethodsfornstheclass) -(id)theundocumentedmethod; @end ... @implementation myclass : mysuperclass -(void) mymethod { ... [theobject theundocumentedmethod]; ... } </code></pre><p>кроме того, я <em>настоятельно</em> не советую вызывать недокументированные методы в коде доставки. интерфейс может и изменится, и это будет ваша вина.</p>

<p> <a href="http://nshipster.com/pragma/#inhibiting-warnings">http://nshipster.com/pragma/#inhibiting-warnings</a> - перейти к разделу запрещающих предупреждений</p>

<p>в objective-c ряд серьезных ошибок появляется только в виде предупреждений. я не только <em>никогда</em> отключаю предупреждения, я обычно включаю "обрабатывать предупреждения как ошибки" (-werror).</p><p>любого типа предупреждений в вашем коде можно избежать, если делать все правильно (обычно путем приведения объектов к нужному типу) или объявлять прототипы, когда они вам нужны.</p>

<p>создайте новый отдельный заголовочный файл с именем "undocumented.h" и добавьте его в свой проект. затем создайте один интерфейсный блок для каждого класса, для которого вы хотите вызывать недокументированные функции, и присвойте каждой категории "(недокументированный)". затем просто включите этот один заголовочный файл в ваш pch. таким образом, ваши исходные файлы заголовков остаются чистыми, есть только один файл для обслуживания, и вы можете закомментировать одну строку в вашем pch, чтобы снова включить все предупреждения.</p><p>я также использую этот метод для устаревших функций в "depreciated.h" с категорией "(depreciated)".</p><p>самое приятное то, что вы можете выборочно включать/отключать отдельные предупреждения, комментируя или раскомментируя отдельные прототипы.</p>

<p>подавление этого конкретного предупреждения небезопасно. компилятор должен знать типы аргументов и возвращается к методу для генерации правильного кода.</p><p>например, если вы вызываете такой метод</p><p>[foo dosomethingwithfloat: 1.0];</p><p>это занимает плавающее число, и прототип не виден, тогда компилятор будет догадываться, что метод принимает двойное число, а не число с плавающей точкой. это может вызвать сбои и неверно интерпретированные значения. в приведенном выше примере на машине с прямым порядком байтов, такой как машины intel, метод получателя будет видеть 0 пройдено, а не 1.</p><p>вы можете прочитать почему в <a href="http://developer.apple.com/documentation/developertools/conceptual/lowlevelabi/articles/ia32.html">i386 abi docs</a> , или вы можете просто исправить свои предупреждения. :-)</p>