В C, в отличие от C ++, и при условии, что вы не используете режим строгого соответствия C99 в своем компиляторе, тогда, когда компилятор сталкивается с чем-то, что выглядит как вызов функции, но идентификатор ранее не был объявлен, тогда Компилятор предполагает, что это имя функции, возвращающей целое число.
int main(void)
{
something_functional(1, 2);
}
Без прототипа компилятор в C90 или в расслабленном режиме C99 будет предполагать, что'thing_functional () 'действительно является функцией, возвращающей целое число.
Если впоследствии вы напишите:
something_functional(double d, char *s)
{
...
}
Компилятор предположит, что возвращаемый тип функции'thing_functional () 'равен int
и позволит скомпилировать код (несмотря на ужасное несоответствие между фактическими типами аргументов в вызове и в определении функции).
Если впоследствии вы напишите:
void something_functional(douebl d, char *s)
{
...
}
компилятор будет совершенно правильно жаловаться, что вы рассказали ему разные вещи о функции, и это делает ее ошибочной.
Существует несколько способов решения проблемы:
- Переместить определение функции перед вызовом функции. Это то, что требуется Паскалю, и приводит к появлению функции main () внизу файла.
Поместите прототип для функции перед ее использованием в файле:
статическая пустота что-то_функция (double d, char * s);
Я считаю, что если функция не будет вызываться извне исходного файла, она должна быть статической.
Обратите внимание, что C99 в режиме строгого соответствия не позволяет вам объявлять функции неявно. C ++ никогда не имеет либо.
Есть еще одна интересная особенность pre-C99. Вы также можете написать:
static c;
static function();
some_function(a, b)
{
}
Это определяет целочисленную переменную c
, функцию с именем function()
, которая возвращает int
, и функцию с именем some_function()
, которая принимает два int
аргумента и возвращает int
.
Это не разрешено в строгом коде C99 - и не было особенно хорошим стилем в коде C90, но было разрешено для обратной совместимости с предстандартным C.