Можно не int, а void (и return убрать, как было).
Первоначальный пример, действительно, некорректен. Может, он был корректным на момент написания книги (возможность не указывать void), а может, оплошность.
Работает: % cat hello.c
#include <stdio.h>
main() {
printf("hello world!\n");
return 0;
}
% gcc -o hello hello.c
hello.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
main() {
^~~~
% ./hello
hello world!
%
А ругается потому что книжка старая, последний раз адаптировалась под стандарт ANSI C, в котором такая запись была допустима. Если сказать компилятору использовать этот стандарт, ругаться не будет: % gcc -ansi -o hello hello.c
%
вообще на предупреждения компилятора обращать внимание стоит. не следует их игнорировать и копить десятками или сотнями. хоть это не ошибки, старайтесь их решать, меньше проблем будет в будущем.