C.89/C.90 допускает неявные декларации функций. Ваши предупреждающие сообщения сообщают вам, что вы не указали явные декларации для scanf
и printf
. Как уже упоминалось, вы можете исправить это, добавив #include <stdio.h>
в начало вашей программы. Не делая этого, поведение вашей программы не определено.
Поскольку scanf()
и printf()
имеют неявные декларации, они рассматриваются, как если бы были даны их прототипы, как:
extern int scanf();
extern int printf();
Эти заявления утверждают, что scanf()
и printf()
принять как еще неизвестное количество аргументов и возвращаемых и int
, Однако этот вид декларации по-прежнему предполагает, что эти функции будут принимать фиксированное количество аргументов.Это несовместимо с их истинными прототипами, в которых они принимают переменное число аргументов:
extern int scanf (const char *, ...);
extern int printf (const char *, ...);
Вашего C компилятор, видимо, знает об истинных прототипах этих функций, поскольку он рассматривает эти функции, как «встроенные модули», значение он может генерировать специальный код случая при компиляции в исходный код, который вызывает эти функции. Поскольку неявное объявление не соответствует его встроенным знаниям своих прототипов, оно порождает предупреждение.
Компилятор, у которого не было этого «встроенного знания», вероятно, не вызвал бы предупреждения. Затем он сгенерировал код для вызова scanf()
и printf()
, как если бы они приняли фиксированное количество аргументов. Ошибка может возникнуть во время выполнения, поскольку соглашение о вызове для функции, которая принимает переменное количество аргументов, может отличаться от вызывающего соглашения функции, которая принимает фиксированное количество аргументов.
Все это описано в C.89 § 3.3.2.2.
If the expression that precedes the parenthesized argument list in a function call consists solely of an identifier, and if no declaration is visible for this identifier, the identifier is implicitly declared exactly as if, in the innermost block containing the function call, the declaration
extern int identifier();
appeared.
...
If the expression that denotes the called function has a type that does not include a prototype, the integral promotions are performed on each argument and arguments that have type float are promoted to double. ... If the function is defined with a type that includes a prototype, and the types of the arguments after promotion are not compatible with the types of the parameters, or if the prototype ends with an ellipsis (" , ...
"), the behavior is undefined.
Обратите внимание, что C.99 удаляет учет неявных деклараций функций.
Добавить '#include' наверху. Также удалите тег 'C++'. –
BoBTFish
Вам нужно #include –
Один короткий отрезок почти во всех случаях, когда вы получаете предупреждение, например * warning: несовместимое неявное объявление встроенной функции '** любая функция **' [включено по умолчанию] *, искать правильные файлы заголовков – 0decimal0