Было бы действительно помочь, если бы вы сказали нам, какой компилятор вы используете, и сообщение об ошибке точный , которое он вам дал. Также было бы полезно, если бы вы немного отформатировали свой код (хотя этот конкретный фрагмент небольшой и достаточно простой для чтения).
Итак, здесь происходит несколько вещей. Во-первых, если вы не ввели явно определение функции, предполагается, что эта функция возвращает int
(то есть функция неявно напечатана int
). Таким образом, предполагается, что main
, push
, pop
и display
возвращают int
. Это очень архаичный и хмурый стиль, и IINM запрещен в соответствии со стандартом C99. Поскольку push
, pop
и display
не возвращают значение вызывающей стороне, они должны быть явно напечатаны void
. main
должен быть явно набран int
(обсуждается ниже).
Во-вторых, если компилятор не видит объявление или определение функции до того, как он увидит вызов функции, он будет считать, что функция возвращает int
. Это может привести к ошибке несоответствия типов, если позже вы определите функцию с другим типом возвращаемого значения, например:
int main(void)
{
...
foo();
...
}
void foo(void) { ... }
Когда компилятор видит вызов foo()
в main()
, он предполагает, что foo()
вернет int
, но затем более позднее определение противоречит этому предположению, поэтому он выдает диагностику.
Урок здесь заключается в том, что вы должны как минимум объявить свои функции перед тем, как вызывать их, например:
int main(void)
{
void push();
void pop();
void display();
...
push();
...
pop();
...
display();
...
}
void push(void) { ... }
void pop(void) { ... }
void display(void) { ... }
и убедитесь, что объявление и определение совпадают. Лично я следую правилу «определить перед использованием», вот так:
void push(void) { ... }
void pop(void) { ... }
void display(void) { ... }
int main(void)
{
...
push();
...
pop();
...
display();
}
Таким образом, вам не нужно беспокоиться о синхронизации объявлений и определений.
Об определении main
: Стандарт C определяет ровно два интерфейса для main
:
int main(void);
int main(int argc, char *argv[]);
Отдельные реализации может определять дополнительные интерфейсы для main
; некоторые добавляют третий параметр, например, так:
int main(int argc, char *argv[], char *env[]);
Ваше определение main
должно соответствовать одной из двух форм, указанных в стандарте, или одной из форм, указанных в документации для вашего конкретного компилятора, иначе поведение программы будет undefined (что может означать что-либо, начиная от запуска, как ожидалось, сбой немедленно или запуск до завершения, но оставляя систему в плохом состоянии, или что-то еще полностью). Есть несколько авторов, которые настаивают на том, что если вам не нужно возвращаемое значение из main()
, вы можете набрать его void
, но это верно только в том случае, если документация компилятора явно говорит, что он поддерживает void main()
,