Вопросы о прототипах и компиляции функций C
Со следующим кодом:
int main(){
printf("%f\n",multiply(2));
return 0;
}
float multiply(float n){
return n * 2;
}
Когда я пытаюсь скомпилировать, я получаю одно предупреждение:% Е» надеется 'двойной», но аргумент имеет тип 'ИНТ» и две ошибки:конфликтующие типы для 'умножить ","предыдущая неявная декларацияумножать» был здесь."
Вопрос 1: Я предполагаю, что этопотому что, учитывая, что компилятор не знает функции 'умножать» когда он сталкивается с этим в первый раз, он изобретает прототип, а изобретенные прототипы всегда предполагаютINT» возвращается и принимается как параметр. Таким образом, изобретенный прототип будетint multiply (int) "и, следовательно, ошибки. Это правильно?
Теперь предыдущий код выигралт даже компилировать. Однако, если я разбью код на два файла, как это:
#file1.c
int main(){
printf("%f\n",multiply(2));
return 0;
}
#file2.c
float multiply(float n){
return n * 2;
}
и выполнить "gcc file1.c file2.c -o file " он все равно выдаст одно предупреждение (что printf ожидает double, но получает int), но ошибки победили 'больше не появится, и он скомпилируется.
вопрос 2: Как получилось, когда я разбил код на 2 файла, которые он компилирует?
Вопрос 3: После запуска вышеуказанной программы (версия разделена на 2 файла) на экране отображается 0,0000. Как так? Я предполагаю, что компилятор снова изобрел прототип, который нене соответствует функции, но почему печатается 0? И если я изменю printf ("% F») в printf ("% D») он печатает 1. Опять любое объяснение того, чтопроисходит за кулисами?
Заранее большое спасибо.