Я программист на Java, я немного научился C++, и теперь я изучаю немного C для своей работы. Я не могу понять поведение C в отношении объявления/определения функции и связанных вызовов функций. Из К & RI знаю, что в C (очень отличается от C++) я могу вызвать функцию, которая не была ранее объявлена, и компилятор предполагает неявное объявление типа:C определение функции и объявление
int main()
{
function(10); // implicit function declaration (int function())
}
, и я знаю, что такое объявление подразумевает функцию, которая принимает фиксированное, но неопределенное количество аргументов любого типа (до тех пор, пока каждый вызов согласуется с другими). И я знаю, что это K & R C, до C89, но я хочу знать, как это работает. Теперь у меня есть тестовый код, я не могу понять:
#include <stdio.h>
function();
int main()
{
printf("hello %d",function(1,2,3));
implicit(11,12,32); // implicit function declaration (implicit())
}
int implicit(int b)
{
}
function(int a)
{
}
в случае function
декларации (предполагается, тип возвращаемого быть ИНТ, никаких предположений об аргументах) ничего не соответствует определению (компилятор выдает предупреждение), но если я вызываю функцию с неправильными аргументами, она компилируется! То же самое для функции implicit
. Я не могу понять.
Эти проблемы возникают именно потому, что C++ требует, чтобы функции были объявлены в расширенном режиме. И это практика, которой я придерживался в C. –
Это старый, устаревший, плохой код. Вам, как начинающему C, действительно нужно знать, как работает плохой код? –
Да, C нужны файлы .h, где вы помещаете свои определения функций (прототипы). Предполагается, что они существуют где-то во время компиляции, а затем не работают во время выполнения. Взгляните на файл stdio.h. –