Ингибирование предупреждения о несовместимом типе указателя в GCC - PullRequest
4 голосов
/ 26 февраля 2012

В моем коде под 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" 

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

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

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

EDIT

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

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

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

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

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

1 Ответ

7 голосов
/ 26 февраля 2012

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

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

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

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

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

...