В C, если вы используете стандартную библиотечную функцию, вам необходимо включить стандартный заголовок, в котором объявлена функция. Для printf
необходимо включить заголовочный файл stdio.h
.
В C89 (и GNU C89, который является языком по умолчанию для gcc
), объявление функции иногда может быть опущено, потому что есть функция, называемая неявным объявлением функции: когда используется идентификатор функции foo
и функция не было объявлено, реализация будет использовать это объявление:
/* foo is a function with an unspecified number of arguments */
extern int foo();
Но это объявление приемлемо только для функций, которые возвращают int
с неопределенным, но фиксированным числом аргументов. Если функция принимает переменное число аргументов (например, printf
), такая программа вызовет неопределенное поведение.
Вот что говорит C89 / C90:
(C90, 6.7.1) "Если функция, которая принимает переменное число аргументов, определена без списка типов параметров, который заканчивается многоточием, поведение не определено.
Так что gcc
достаточно любезен для компиляции даже в C89 и GNU C89: компилятор может отказаться от компиляции.
Также обратите внимание, что
void main() { ... }
не является допустимым определением для main
(по крайней мере, для размещенных реализаций , что, вероятно, соответствует вашему случаю).
Если ваша основная функция не принимает аргументов, используйте это правильное определение:
int main(void) { ... }