Почему прототип функции находится внутри другого функционального блока?

Я пытаюсь понять C, пройдя K & R. Мне трудно понять этот код для двух функций, найденных в книге:

void qsort(int v[], int left, int right){
int i, last;

void swap(int v[], int i, int j);

if (left >= right)
    return;

swap(v, left, (left+right)/2);

last = left;

for ( i = left+1; i<=right; i++)
    if (v[i]<v[left])
        swap(v,++last, i);

swap(v,left,last);
qsort(v,left,last-1);
qsort(v,last+1,right);
}


void swap(int v[], int i, int j){

    int temp;

    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
}

Эти две функции выполняют quicksort для заданного массива. В основной функции я создал массив int и называл qsort. Он скомпонован и отлично работает. Мой вопрос: почему прототип для swap() помещается в функцию qsort(), а не перед main()?

Ответ 1

Прототип должен быть добавлен до того, как фактическая функция будет использоваться в первый раз. В этом случае я не считаю, что его общая практика имеет прототип в функции qsort(), однако она все еще служит цели. Прототип для swap() также можно добавить до main(), не думайте, что это будет иметь значение.

Ответ 2

Вы пишете прототип функции, чтобы компилятор знал, что существует функция, и может ее использовать. swap() используется внутри qsort(), поэтому он должен отображаться перед используемой линией. В этом случае прототип swap() объявляется внутри функции qsort(), но он также может быть объявлен перед самой функцией. Или вы можете определить swap() до qsort() и удалить прототип.

Ответ 3

Размещение прототипов функций в определениях других функций обеспечивает применение принципа наименьших привилегий, ограничивая надлежащие вызовы функций функциями, в которых появляются прототипы.