Во-первых, если "если я создам две функции и одна из них ссылается на другую, будет ли она работать?"Вы имеете в виду что-то вроде этого:
int foo()
{
return bar();
}
int bar()
{
return 0;
}
Тогда компилятор может сделать обоснованные предположения о том, что такое bar()
, но он хотя бы выдаст предупреждение, если bar()
еще не было объявлено .Для символов, которые не могут быть вызваны (например, переменные или типы), это полная ошибка, если они используются до того, как они объявлены.
В C всякий раз, когда вы используете идентификатор (и неважно, какойидентификатора: это может быть функция, переменная, тип и т. д.), это должно быть объявлено заранее.Различные модификаторы, которые вы можете добавить к любому идентификатору (как вы сказали, static
, inline
и все остальные) не влияют на это.
Не путайте объявление и определение .Объявление просто говорит компилятору, что имя существует;определение фактически сообщает компилятору, что это такое.
Например, это определение:
int bar() { return 4; }
Обратите внимание на то, что у него есть тело с (простым) кодом внутри.
Это соответствующее объявление:
int bar();
Компилятор с радостью примет использование функции, как только увидит объявление или определение для нее.Из соображений организации и большей гибкости, часто лучше написать декларации для всех ваших функций в начале вашего файла C (или внутри включенного заголовочного файла), чем в определениях.
Итак, мой первый пример должен выглядеть такthis:
int foo();
int bar();
int foo()
{
return bar();
}
int bar()
{
return 0;
}
С помощью объявлений над кодом C я могу изменять порядок функций любым способом, который мне нравится.