Нет абсолютно ничего плохого в том, что здесь сделал Столлман.
Язык C допускает forward объявление функции, которая будет определена впоследствии.
Это имеет много преимуществ и не должно рассматриваться как плохое поведение, а скорее очень хорошее поведение.
Преимущества (не исчерпывающие):
- дать программисту видениеAPI, предоставляемый кодом C, в кратком обзоре, без необходимости просмотра всего кода
- разрешает использование заголовочных файлов, где вы объявляете функцию, которая будет определена позже в процессе компиляции.Так что вам не нужно определять вашу функцию каждый раз, когда вы ее используете ..
В случае этой реализации ls
он просто предварительно объявил функции, которые он 'Я буду использовать в main()
, но если вы внимательно посмотрите, главная функция появится первой.Это наиболее вероятно для удобства чтения, так что вам не нужно прокручивать весь путь вниз, чтобы достичь точки входа в программу.
Обратите внимание, что здесь важен словарный запас:
- объявление функции означает: просто сообщает компилятору, что где-то в вашем коде будет определена функция с тем же именем.
- определение функции : фактическая реализация функции
int my_function( char *text); // function declaration, no implementation
int main( int argc, char **argv)
{
return my_function(argv[0]); // use of the declared function
}
// actual function definition / implementation
int my_function( char *text )
{
printf("%s\n", text);
}
Редактировать : после более внимательного изучения кода вы увидите, что Столлман не объявлял все свои функции вперед.У него также довольно странная манера определения функций.Я приписываю это старости кода, который датируется 1985 годом, когда компилятор C не был так хорошо определен, как сегодня.Должно быть, он разрешил использование функции такого типа до объявления или определения .
Последнее, но не менее важное: можно найти недавнюю версию ls
исходного кода.здесь: http://coreutils.sourcearchive.com/documentation/7.4/ls_8c-source.html,
с гораздо большим C99-совместимым кодированием, чем версия '85 (Back-to-the-Future).