Когда я скомпилировать код, как $ gcc common.c -o common.exe -Wall
(Попытка его на Cygwin терминале, как я не моя система Linux со мной прямо сейчас)
я получаю следующие предупреждения:
common.c:3:1: warning: return type defaults to ‘int’ [-Wreturn-type]
main()
^
common.c: In function ‘main’:
common.c:6:2: warning: implicit declaration of function ‘workover’ [-Wimplicit-f unction-declaration]
workover(i);
^
common.c: At top level:
common.c:9:1: warning: return type defaults to ‘int’ [-Wreturn-type]
workover(i)
^
common.c: In function ‘main’:
common.c:8:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
- Первый и третий говорит:
return type defaults to ‘int’
, что означает, что если вы не укажете тип возврата, компилятор будет неявно объявить его как int
.
- Второй говорит,
implicit declaration of function ‘workover’
, поскольку компилятор не знает, что такое workover
.
- Третье предупреждение довольно просто понять и исчезнет, если вы исправите первый.
Вы должны сделать это таким образом:
#include <stdio.h>
int workover(int);
int i;
int main(void)
{
int i = 5;
workover(i);
printf("%d",i); //prints 5
return 0;
}
int workover(int i)
{
i = i*i; //i will have local scope, so after this execution i will be 25;
return(i); //returns 25
}
Это * не * по-прежнему в силе: «[* C99 является, по большей части, обратная совместимость с C89, но строже в некотором роде. ** В частности, декларация, в которой отсутствует спецификатор типа, уже не подразумевает «int». ***] (https://en.wikipedia.org/wiki/C99#Design) «Вот почему может быть создано предупреждение , – Frxstrem
Эти два не совсем эквивалентны; 'workover (i) int i;' не является прототипом, а 'workover (int i)' is. Это похоже на разницу между 'int main()' и 'int main (void)' –