Прежде всего, gcc не является совместимым компилятором C по умолчанию. Он реализует диалект C89/C90 с расширениями GNU.
Вы можете использовать -std=cNN -pedantic
(где NN
может быть 90
, 99
или 11
), чтобы вызвать его (попытка) соответствовать указанной версии стандарта ISO C. C90 допускается неявным int
; он был сброшен на C99.
Но компиляторы C на самом деле не являются для генерации фатальных сообщений об ошибках (за исключением директивы #error
). Требование Стандарта (N1570 5.1.1.3p1) является:
A conforming implementation shall produce at least one diagnostic message (identified in an implementation-defined manner) if a preprocessing translation unit or translation unit contains a violation of any syntax rule or constraint, even if the behavior is also explicitly specified as undefined or implementation-defined. Diagnostic messages need not be produced in other circumstances.
нефатального предупреждения квалифицируется как «диагностическое сообщение». Соответствующий компилятор C может печатать предупреждение для любой ошибки - даже синтаксическую ошибку - и затем продолжать успешно компилировать исходный файл. (Так могут поддерживаться некоторые расширения языка для компилятора.)
Лично я нахожу gcc, чтобы быть слишком слабым относительно определенных ошибок; по-моему, отсутствующий int
должен рассматриваться как фатальная ошибка. Но это только мое предпочтение, а не требование, налагаемое стандартом.
Урок здесь заключается в том, что вы не должны предполагать, что простые предупреждения безвредны.В идеале, компиляция вашего кода не должна производить диагностики вообще. Случаи, когда нормально игнорировать предупреждения, редки (но они существуют, поскольку компиляторы могут предупреждать о совершенно правильном коде).
Как ни странно, '-Werror = implicit-int' работает для Clang, но не GCC, а' -pedantic-errors' работает для GCC, но не Clang. –