Когда я помещаю функцию сообщения выше main (), она не показывает ошибку.Почему это?Разве мы не можем поместить функции после main ()?
C Исходные файлы анализируются сверху вниз.Таким образом, к тому времени, когда компилятор видит вызов функции message
(в основном), он должен знать об этом (в основном это относится и к любому символу).Вот почему это выше работает, но ниже приводит к диагностике.
Как минимум, вы должны предоставить объявление для любого идентификатора перед его использованием.
Что такое неявное объявление здесь?
Когда компилятор видитвызов функции и не знал об этом, он предполагает функция возвращает int
(например, int message();
).Это «неявное объявление».Это было древнее правило, которое действовало до C99 .
Но в C99 и позже это правило было удалено.Таким образом, ваш код (который помещает определение «сообщение» ниже основного без объявления) недействителен в C99 и позже.См. вызовы функций C: понимание правила "implicit int" .
Позже, когда компилятор увидит фактическое определение message
(то есть void message() {...
), он увидит тип возвращаемого значенияна самом деле void
.Таким образом, это вступает в противоречие с его собственной декларацией (где оно приняло int
).Таким образом, он генерирует:
msg.c:8:6: warning: conflicting types for ‘message’