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

Я пытаюсь понять 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;
}

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

Ответы [ 3 ]

5 голосов
/ 17 февраля 2011

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

5 голосов
/ 17 февраля 2011

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

1 голос
/ 12 апреля 2019

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

...