Полезные флаги GCC для C - PullRequest
152 голосов
/ 31 июля 2010

Помимо настройки -Wall и настройки -std=XXX, какие еще действительно полезные, но менее известные флаги компилятора существуют для использования в C?

Меня особенно интересуют любые дополнительные предупреждения и /или и превращение предупреждений в ошибки в некоторых случаях, чтобы свести к минимуму случайные несоответствия типов.

Ответы [ 24 ]

10 голосов
/ 14 августа 2010

Мой make-файл обычно содержит

  CFLAGS= -Wall -Wextra -Weffc++ -Os -ggdb
  ...
  g++ $(CFLAGS) -o junk $<
  gcc $(CFLAGS) -o $@ $<
  rm -f junk

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

Несмотря на то, что я работаю над базой кода, которой нужно , чтобы быть простым C для переносимости на какую-то платформу, у которой все еще нет достойного компилятора C ++, я делаю "дополнительную" компиляцию с компилятором C ++ (в дополнение к компилятору C). Это имеет 3 преимущества:

  1. компилятор C ++ иногда выдает мне лучшие предупреждающие сообщения, чем компилятор C.
  2. Компилятор C ++ принимает опцию -Weffc ++, которая иногда дает мне несколько полезных советов, которые я бы упустил, если бы я только скомпилировал их в простом C.
  3. Я могу сделать код относительно простым для переноса на C ++, избегая нескольких граничных условий, когда простой код C является недопустимым кодом C ++ (например, определение переменной с именем "bool").

Да, я безнадежно оптимистичная Поллианна, которая все время думает, что наверняка в любой месяц, что одна платформа будет либо объявлена ​​устаревшей, либо получит достойный компилятор C ++, и мы наконец сможем переключиться на C ++. На мой взгляд, это неизбежно - вопрос только в том, произойдет ли это до или после того, как руководство наконец выпустит всех пони. : -)

9 голосов
/ 31 июля 2010
-Wstrict-prototypes -Wmissing-prototypes
9 голосов
/ 14 августа 2010

Вот замечательный флаг, который не был упомянут:

-Werror-implicit-function-declaration

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

8 голосов
/ 31 июля 2010
man gcc

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

6 голосов
/ 07 января 2012

-M* семейство опций.

Они позволяют вам писать make-файлы, которые автоматически выясняют, от каких заголовочных файлов должны зависеть ваши исходные файлы c или c ++. GCC создаст файлы make с этой информацией о зависимостях, а затем вы включите их в основной файл make.

Вот пример чрезвычайно универсального make-файла с использованием -MD и -MP, который скомпилирует каталог, полный исходных и заголовочных файлов c ++, и автоматически определит все зависимости:

CPPFLAGS += -MD -MP                                         
SRC = $(wildcard *.cpp)                                                       

my_executable: $(SRC:%.cpp=%.o)                                                        
        g++ $(LDFLAGS) -o $@ $^                                               

-include $(SRC:%.cpp=%.d)

Вот запись в блоге, которая обсуждает это более подробно: http://www.microhowto.info/howto/automatically_generate_makefile_dependencies.html

6 голосов
/ 31 июля 2010

Ну, -Wextra тоже должно быть стандартным.-Werror превращает предупреждения в ошибки (которые могут очень раздражать, особенно если вы компилируете без -Wno-unused-result).-pedantic в сочетании с std=c89 выдает дополнительные предупреждения при использовании функций C99.

Но это все.Вы не можете настроить компилятор C на что-то более сохраняющее тип, чем сам C.

6 голосов
/ 31 июля 2010

Существует -Werror, который обрабатывает все предупреждения как ошибки и останавливает компиляцию. Страница gcc руководства объясняет каждый параметр командной строки для вашего компилятора.

4 голосов
/ 25 октября 2012

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

Флаг -Wformat=2

-Wformat => Проверить вызовы printf и scanf и т. Д., Чтобы убедиться, что предоставленные аргументы имеют типы, соответствующие указанной строке формата...

И действительно важная часть об этом ( согласно руководству GCC ):

-Wformat включена в -Wall.Для большего контроля над некоторыми аспектами проверки формата доступны опции -Wformat-y2k, -Wno-format-extra-args, -Wno-format-zero-length, -Wformat-nonliteral, -Wformat-security и -Wformat=2, но они не включены в -Wall.

То есть, если у вас есть -Wall, это еще не значит, что у вас есть все.;)

4 голосов
/ 31 июля 2010

-Wfloat-equal

От: http://mces.blogspot.com/2005/07/char-const-argv.html

Еще одно новое предупреждение, которое мне нравится, это -Wfloat-equal. Этот предупреждает всякий раз, когда у вас [есть] число с плавающей точкой в ​​условии равенства. Это блестяще! Если у вас есть все запрограммированные алгоритмы компьютерной графики или (что еще хуже :) вычислительной геометрии, вы знаете, что никакие два числа с плавающей запятой никогда не совпадают с равенством ...

3 голосов
/ 31 июля 2010

Я иногда использую -s для гораздо меньшего исполняемого файла:

-s
    Remove all symbol table and relocation information from the executable.

Источник: http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options

...