Почему прототип функции находится внутри другого функционального блока?
Я пытаюсь понять 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
Размещение прототипов функций в определениях других функций обеспечивает применение принципа наименьших привилегий, ограничивая надлежащие вызовы функций функциями, в которых появляются прототипы.