Почему типы параметров объявлены вне скобки?

несколько раз я вижу, что функции определены ниже:

read_dir(dir)
char    *dir;   
{
        DIR * dirp;
        struct dirent *d;

        /* open directory */
        dirp = opendir(dir);
  ......... so  on

вот в чем важность утверждения

char    *dir;

что такое намерение за объявлением указателя вскоре после имени функции, а затем запуск тела функции.

Ответ 1

Это более старый синтаксис C, kalled " K & RC", так как он появился в исходной версии легендарная книга.

Что раньше было написано так:

foo(a, b)
int a;
int b;
{
}

теперь

int foo(int a, int b)
{
}

Ответ 2

Это просто "старый стиль", определение функции K & RC (см. Книга Кернигана и Ричи, обычно называемая просто Керниганом и Ричи.)

Код, на который вы ссылаетесь, возможно, был написан в конце восьмидесятых или в начале девяностых с переносимостью (т.е. совместимость со старыми компиляторами, возможно, на более "экзотических" платформах).

Даже после публикации стандарта C 1989 года K & RC по-прежнему считался "самым низким общим знаменателем", которому программисты C ограничивали себя, когда была необходима максимальная мобильность, поскольку многие старые компиляторы все еще использовались, и потому что тщательно написанный K & RC-код также может быть стандартным стандартом C.

Некоторые люди могут полагать, что определение функции K & R-стиля, которое все еще поддерживается компиляторами, более читаемо, что на самом деле не обязательно верно; Для сравнения:

some_function(param1,param2,param3)
char    *param1;   /* param1 comment */
int     param2;    /* param2 comment */
short   param3;    /* param3 comment */
{
}

с

/* notice also that return type is explicitly specified now */
int
some_function(
  char    *param1, /* param1 comment */
  int     param2,  /* param2 comment */
  short   param3   /* param3 comment */
)   
{
}

Определения функции K & R-стиля были устаревшими с 1989 года; видеть раздел 6.9.5 "Определения функций" в стандарте C90.