2012-02-25 3 views
4

В моем коде под GCC я получаю довольно много предупреждений об этих двух типах.Ингибирование несовместимого указателя типа конкретного предупреждения в GCC

warning: passing argument 1 of 'foo' from incompatible pointer type 

и

warning: assignment from incompatible pointer type 

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

Но теперь мой код вырос до такой степени, что эти предупреждения затмевают что-либо еще, в сущности скрывая потенциальные предупреждения, которые могут привести меня к неприятной ошибке. Поэтому я решил помешать им. Вскоре я понял, что не знаю, как это сделать. Моя версия gcc 4.4.1, и я знаю, что могу использовать:

#pragma GCC diagnostic ignore "-Wname" 

игнорировать любое предупреждение, которое я хочу. Но из единственного big and comprehensive list предупреждений GCC, которые я нашел, я не могу найти, какие из них есть. Я пришел к тому, чтобы собрать их один за другим и превратить их в ошибки, чтобы увидеть, когда компиляция остановится из-за несовместимого типа указателя, но безрезультатно, как показано ниже.

#pragma GCC diagnostic error "-Wimplicit-int" 
#pragma GCC diagnostic error "-Waddress" 
#pragma GCC diagnostic error "-Wreturn-type" 
      .... //e.t.c. 

Итак, вопрос в том, знает ли кто-нибудь имя этих предупреждений, чтобы я мог фактически их заблокировать?

EDIT

В связи с обсуждением в комментариях я должен прояснить неправильное представление, что у меня было что привело меня к мысли, что я должен был подавлять предупреждения. Я думал, что есть какая-то стоимость (независимо от того, насколько минимальна) участие в выполнении явных бросков между указателями на структуры.

Итак, мое мышление, которое я теперь понял, было ошибочным, было то, что, поскольку моя программа работает и долгое время работала на разных платформах, зачем добавлять работу, чтобы просто удовлетворить компилятор?

Ну, теперь я понял, и я пишу это здесь, если кто-то еще спотыкается над этой темой и имеет ту же линию мышления. Там нет расходов, связанных с выполнением явного типажей указателей и преимущества:

  • Компилятор останавливается нытье вас с предупреждениями
  • Другие люди могут знать, что вы сделали бросок намеренно там и не делал ошибок

Так что это для всех, у кого может быть тот же вопрос.

+2

Всегда помните о предупреждениях - они есть по какой-то причине. Это очень хорошая идея для компиляции с флагом '-Wall', а затем для фиксации предупреждений. –

+1

Из любопытства и никоим образом не ставя под сомнение ваш гений, могу ли я спросить, что этот код вызывает предупреждение? –

+0

@EdHeal Я согласен с тобой, и поэтому я хочу отключить эти два, потому что в моем коде они меня не помогают, вместо этого они затмевают другие предупреждения, которые могут быть полезны. Мне нужно исправить компилятор, препятствующий моей работе, а не помогая мне в этом. У меня есть причины для игнорирования этих конкретных предупреждений. Вопрос в том, как это сделать, чтобы я мог сосредоточиться на «реальных» предупреждениях. – Lefteris

ответ

7

Если вы используете опцию -fdiagnostics-show-option, GCC покажет вам имя предупреждения, и вы можете его отключить.

Отключение предупреждения, вероятно, не является хорошей идеей: если позже будет законный случай этого предупреждения, вы не узнаете об этом.

Вам лучше исправить код, чтобы предотвратить предупреждение. В вашем случае это так же просто, как добавление явного указателя.

float f = 1.23; 
char *a = &f; //warning 
char *b = (char*)&f; //no warning 

Использование явного приведения даст ясно понять всем, кто читает код, который менял тип указателя, был сделан намеренно.

+0

Спасибо за ваш ответ. Я знаю, что явное приведение удалит предупреждения, но меня беспокоит стоимость трансляции. Поскольку то, что я делаю, происходит в значительной части модуля моего кода. Должен признаться, что я не уверен, что такое стоимость, и как компилятор действительно реализует трансляции. Все предупреждения не на примитивах, а на довольно больших структурах. Все это связано с моей «эмуляцией» наследования структуры. – Lefteris

+1

На самом деле кажется, что -fdiagnostics-show-option отображает имя почти всех предупреждений, за исключением нескольких. Два предупреждения, которые меня интересовали, относятся к числу этих немногих. И от чтения здесь: http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html кажется, что вы можете только подавлять предупреждения, которые могут появляться через -fdiagnostics-show-option. Кажется, что на самом деле их запрещение под gcc не является опцией – Lefteris

+0

@Lefteris: стоимость явного приведения такая же, как и для неявного литья. –

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