В моей системе установлен компилятор minGW GCC. Я пишу код на C. Что-то, что в остальном нормально, по какой-то причине не компилируется должным образом.
#include <stdio.h>
#include <math.h>
int main() {
sayHi();
return 0;
}
void sayHi(){
printf("Hello bro");
}
Вывод в cmd: 6:2: warning: implicit declaration of function 'sayHi' [-Wimplicit-function-declaration]
Тогда написано 10:6: warning: conflicting types for 'sayHi' void sayHi(){
.
Кроме того, :6:2: note: previous implicit declaration of 'sayHi' was here sayHi();
Я попробовал то же самое в онлайн-компиляторе, но это все равно не работает и выдает ту же ошибку. Однако в руководстве по freecodecamp был написан тот же код, но он выполнился отлично. Как это возможно?
О, большое спасибо! Я знаю, что в C компилятор прочитает одну строку, а затем перейдет к следующей. Итак, если я поставлю void sayHi()
перед int main()
, код будет работать нормально. Я был просто озадачен, почему этого не произошло с чуваком из обучающего видео по freecodecamp :/ Я имею в виду, что он поставил void sayHi()
после int main()
, но у него это сработало!?
@Student, вероятно, упомянутое вами учебное видео по freecodecamp - чушь, как и многие учебные пособия. Но имейте в виду, что это предупреждения, а не ошибки, поэтому это вполне может сработать.
Не используйте случайные учебные пособия по C, которые вы найдете в Интернете, 99,99% из них более чем бесполезны.
Спасибо всем за отзывы и направление в правильном направлении :)
Компилятору необходимо знать о функции SayHi() перед ее использованием. Есть два варианта:
Переместите определение функции SayHi() над основной функцией.
Объявите функциюsayHi() перед основной функцией, например:
недействительный сказатьПривет ();
Когда компилятор видит sayHi();
, он еще не «видел» void sayHi()
и поэтому считает, что sayHi()
неявно объявлено как int sayHi()
.
Затем он «видит» void sayHi()
, но поскольку sayHi()
теперь (неявно) объявлен как int sayHi()
, тип возвращаемого значения теперь конфликтует, отсюда и предупреждение.
Как правило, предупреждения, содержащие слово «неявно», следует рассматривать как ошибки.
Вы хотите это:
void sayHi(); // declare explicitly before using it
int main() {
sayHi();
return 0;
}
void sayHi(){
printf("Hello bro");
}
или это:
void sayHi() { // put the whole function before using it
printf("Hello bro"); // which declares it as void
}
int main() {
sayHi();
return 0;
}
Даже лучше:
void sayHi()
должно быть void sayHi(void)
, что означает, что функция sayHi
вообще не принимает никаких параметров.
Возможно, вы захотите прочитать некоторые основы языка в учебнике по вашему выбору. tl;dr — всякий раз, когда компилятор впервые встречает имя, он должен иметь возможность определить имя того типа сущности, с которым он столкнулся. С этой целью каждая функция должна быть как минимум объявлена перед вызовом, сообщая компилятору: «
sayHi
— это имя функции, не принимающей аргументов и ничего не возвращающей», например:void sayHi();
(передmain()
).