Какие параметры GCC должны быть установлены, чтобы GCC был максимально строгим? (и я имею в виду как можно более строгий) Я пишу на C89 и хочу, чтобы мой код был совместим с ANSI / ISO.
Опции GCC для строжайшего кода C?
Ответы (2)
Я бы рекомендовал использовать:
-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; { ... }
Если вам повезет, вам не о чем беспокоиться. Мне не так везет с работой, и я не могу использовать строгие прототипы, к моему большому огорчению, потому что вокруг слишком много неряшливых указателей на функции.
См. Также: Какая лучшая команда- инструмент линии для очистки кода
-Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition
- хорошая идея, но они не касаются соответствия стандартам. Объявления и определения функций в старом стиле устарели с 1989 года, но они все еще являются частью языка; даже компиляторы, соответствующие требованиям C2011, должны их поддерживать.
- person Keith Thompson; 21.01.2012
-pedantic
при чтении: D Да, но я все же рекомендую использовать параметры, чтобы код был максимально переносимым для более поздних версий стандарта. Я не удивлюсь, если обнаружу, что C2021 наконец теряет стандартную поддержку для функций, не являющихся прототипами, хотя реализации, вероятно, продолжат поддерживать старые обозначения еще 10-20 лет после этого. C11 также исключает gets()
; Я тоже не думаю, что он надолго исчезнет из библиотек. Этого следует избегать, даже если он полностью совместим с C89.
- person Jonathan Leffler; 21.01.2012
__VA_ARGS__
- его надо где-то использовать? Или что-то еще. Я просмотрел отчет об ошибке и, честно говоря, не знал, какие изменения требовались.
- person Jonathan Leffler; 12.07.2017
Этот набор опций неплохой:
-Wall -Wextra -ansi -pedantic
Вам нужно будет прочитать документацию, чтобы увидеть, не пропадают ли какие-либо лишние предупреждения из-за этой комбинации.
Следует предупредить, что строгий C89 не включает поддержку комментариев в стиле //
, и существуют довольно серьезные ограничения на количество значащих символов в именах объектов с внешней связью.