2014-10-23 1 views

ответ

7

Это потому, что даже если implicit int is no longer part of the C standard since C99 некоторые компиляторы по-прежнему поддерживают его, главным образом, чтобы предотвратить разрыв старого кода. Так эта линия:

dfljshfksdhfl; 

заканчивает тем, что эквивалентно:

int dfljshfksdhfl; 

clang дает нам гораздо более информативный предупреждение по умолчанию:

warning: type specifier missing, defaults to 'int' [-Wimplicit-int] 
dfljshfksdhfl; 
^~~~~~~~~~~~~ 

Мы можем использовать -pedantic-errors флаг, чтобы включить это в ошибке, хотя, как ни странно, это не работает для clang, поэтому нам нужно обратиться к -Werror и включить все предупреждения в к ошибкам, которые на самом деле являются хорошей привычкой. Как remyabel указывает на clang, мы также можем использовать -Werror=implicit-int.

+0

Как ни странно, '-Werror = implicit-int' работает для Clang, но не GCC, а' -pedantic-errors' работает для GCC, но не Clang. –

1

Я уже ответил similar question (на самом деле я уверен, что это дубликат, но что угодно), и ответ найден в обосновании C99.

A new feature of C99:

In C89, all type specifiers could be omitted from the declaration specifiers in a declaration. In such a case int was implied. The Committee decided that the inherent danger of this feature outweighed its convenience, and so it was removed. The effect is to guarantee the production of a diagnostic that will catch an additional category of programming errors. After issuing the diagnostic, an implementation may choose to assume an implicit int and continue to translate the program in order to support existing source code that exploits this feature.

@ ответов Шафик рассказывает вам один способ превратить предупреждение в ошибку (для Clang). Если вы считаете, что -Werror слишком строгий, вы можете включить это предупреждение в ошибку с помощью -Werror=implicit-int. В GCC, кажется, что требуется -pedantic-errors.

0

Прежде всего, 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должен рассматриваться как фатальная ошибка. Но это только мое предпочтение, а не требование, налагаемое стандартом.

Урок здесь заключается в том, что вы не должны предполагать, что простые предупреждения безвредны.В идеале, компиляция вашего кода не должна производить диагностики вообще. Случаи, когда нормально игнорировать предупреждения, редки (но они существуют, поскольку компиляторы могут предупреждать о совершенно правильном коде).