В C (до C99) вам не нужно объявлять функции, чтобы использовать их. Компилятор будет считать, что функция принимает переданные ему типы параметров, и что функция возвращает int
. Это, однако, может быть довольно проблематичным, и поведение не определено, если функция этого не делает. Давайте посмотрим на это:
/* file1.c */
void foo(char a, char b) {
/* doing something ... */
}
/* main.c */
int main(void) {
char a = 'a', b = 'b';
/* char variables are promoted to int
before being passed */
foo(b, a);
}
Поскольку типы продвигаются (char -> int, float -> double
), если не было объявления функции во время ее вызова, аргументы не могут быть переданы в нужных местах в памяти.
Доступ к b может привести к любопытному значению параметра. Что касается побочного узла, такая же проблема возникает, когда вы передаете аргументы vararg functions
, например prinft
, или функциям, не имеющим прототипа (например, void f()
, где нет информации о типах параметров и числе). Это причина того, что вам всегда нужно обращаться к переменным аргументам с va_arg
, используя их продвинутый тип. GCC предупредит вас, если вы этого не сделаете.
Всегда включайте правильные заголовочные файлы, чтобы не сталкиваться с этими проблемами.
Редактировать: спасибо Крису за то, что он указал, что char literals
(как 'a'
) всегда имеет тип int
в C