Параметры GCC для строжайшего кода C?

Какие параметры GCC должны быть настроены так, чтобы GCC был как можно более строгим? (и я имею в виду как можно более строгий) Я пишу на C89 и хочу, чтобы мой код соответствовал требованиям ANSI/ISO.

Ответ 1

Я бы рекомендовал использовать:

-Wall -Wextra -std=c89 -pedantic -Wmissing-prototypes -Wstrict-prototypes \
    -Wold-style-definition

Вы должны скомпилировать с -O, а также -g, поскольку некоторые предупреждения доступны только при использовании оптимизатора (на самом деле я обычно использую -O3 для определения проблем). Вы можете предпочесть -std=gnu89, поскольку это отключает меньшее количество расширений в библиотеках. OTOH, если вы кодируете строгий ANSI C89, возможно, вы хотите, чтобы они были отключены. Параметр -ansi эквивалентен -std=c89, но не совсем явный или гибкий.

Пропущенные прототипы предупреждают вас о функциях, которые используются (или о внешних функциях) без прототипа в области видимости. Строгие прототипы означают, что вы не можете использовать "пустые круглые скобки" для деклараций или определений функций (или указателей функций); вам нужен либо (void), либо правильный список аргументов. Определение старого стиля определяет определения функции стиля K & R, такие как:

int old_style(a, b) int a; double b; { ... }

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

Смотрите также: Какой лучший инструмент командной строки для очистки кода

Ответ 2

Этот набор параметров довольно хорош:

-Wall -Wextra -ansi -pedantic

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

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