gcc: Использование -Werror и -pedantic считается хорошей практикой? - PullRequest
17 голосов
/ 04 апреля 2010

Я просто копаюсь в руководстве по gcc, и некоторые вещи до сих пор мне неясны:

  1. При указании std, я всегда должен использовать -pedantic в сочетании?
  2. При использовании -g достаточно стандартного уровня или я должен указать уровень 3, т.е. -g3
  3. Является ли эффективной практикой использование -Werror для преобразования всех предупреждений об ошибках и -pedantic-errors для преобразования всех педантичных предупреждений об ошибках?

Ответы [ 4 ]

21 голосов
/ 04 апреля 2010

Если вы пишете библиотеку, do убедитесь, что такая простая программа, как

#include <yourlib.h>
int main() {
    return 0;
}

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

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

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

$ gcc -Wall -Wextra -Werror -std=c99   -pedantic
$ gcc -Wall -Wextra -Werror -std=gnu99 -pedantic
$ gcc -Wall -Wextra -Werror -std=c89   -pedantic
$ gcc -Wall -Wextra -Werror -std=gnu89 -pedantic
8 голосов
/ 04 апреля 2010

Все это вопросы мнения и / или зависимости от вашей кодовой базы и практики программирования. Я всегда компилирую с -Wall и -pedantic, мне все равно, помечены ли вещи как ошибки или предупреждения, поэтому я никогда не использую -Werror, и я очень редко отлаживаю код с помощью отладчика - когда я это делаю, -g достаточно. Кто-то другой может придумать совершенно другой ответ.

6 голосов
/ 04 апреля 2010

Это все очень субъективно. Вот мои мнения:

  1. Использование -pedantic не должно быть связано с использованием -std=foo. Используйте -pedantic, если вы хотите сообщения о педантичных ошибках; если вы используете -pedantic, вы, вероятно, также захотите -Wall и -Wextra, поскольку ваша цель обычно состоит в том, чтобы поймать все возможные ошибки, независимо от того, насколько они незначительны. Обратите внимание, что -pedantic не будет перехватывать все возможные предупреждения, только предупреждения, для которых стандарт ISO C требует диагностики.

  2. Я всегда находил уровень 2 (по умолчанию с -g) достаточным для моих целей. Уровень 3 также включает в себя информацию обо всех определениях макросов в вашей программе, но это полезно, только если ваш отладчик поддерживает расширения макросов; мой не (GNU GDB 6.3.50-20050815 (версия Apple, GDB-696)). Я не знаю, что еще включает в себя уровень 3, а уровень 2 - нет.

  3. Это зависит. Если ваша цель заключается в создании наиболее переносимого, наиболее совместимого со стандартами кода, тогда да, я настоятельно рекомендую всегда использовать -Werror и -pedantic-error (вместе с -Wall и -Wextra), особенно при запуске новых проектов. , Однако, если вы начинаете с большой кодовой базы, включение этих параметров, вероятно, даст вам массу безобидных, ложных ошибок, особенно для таких вещей, как несоответствие со знаком / без знака и неявные преобразования между различными типами. Вам понадобится очень много времени, чтобы починить кодовую базу для устранения этих ошибок, поэтому я бы не советовал.

    Если вы делаете быстрый одноразовый проект, не беспокойтесь, так как это только замедлит вас.

    Если вы работаете над библиотекой или чем-то, что получит открытый исходный код, тогда, пожалуйста, включите их. Ваши пользователи по достоинству оценят тот факт, что ваш код не выдает ошибок или предупреждений. Также примите во внимание совет ndim .

3 голосов
/ 04 апреля 2010

Мне нравится использовать -Wall -Wextra для C ++. Однако, если -Wextra выдает предупреждения о заголовках библиотек, которые я использую, я обычно их пропускаю.

...