Объявление функции внутри функции? - PullRequest
5 голосов
/ 20 марта 2010

Я наткнулся на следующий код и, будучи новичком в C, пришел сюда за вашей помощью.

Эта функция из реализации очереди c.

Bool queuePut(Queue *q, char c) 
{
    void beep();

    if (queueFull(q)) 
    {
        beep();
        return false;
    }

    //do stuff

    return true;
}

Итак, я получаю странную ошибку с gcc на пустом звуковом сигнале (). Может кто-нибудь, пожалуйста, объясните мне, что это, объявив функцию внутри функции. Или это пустой звук () просто неуместен? Мне дали этот код, и всегда есть вероятность, что он неправильный.

Редактировать: получаю ошибку:

c:/djgpp/tmp/src/ccrjtmBh.o:queue.c:(.text+0x50): undefined reference to
    '_beep'
collect 2: ld returned 1 exit status.

Это ошибка компоновки?

Ответы [ 3 ]

4 голосов
/ 20 марта 2010

Скорее всего, у вас ошибка компоновки, потому что:

void beep();

- это прототип функции, которая должна быть определена в другом месте. В C вы не можете определить функцию внутри другой. Пожалуйста, опишите ошибку, которую вы получаете.

3 голосов
/ 20 марта 2010

Это необычно, но законно.Ошибка, которую вы видите, может быть связана с компоновщиком, если нигде не определено действительное значение beep().Можете ли вы опубликовать фактическую ошибку, которую вы получили?

1 голос
/ 20 марта 2010

Как уже отмечали другие, здесь происходит то, что ваша функция объявляет прототип для функции с именем "beep".Чтобы обойти это, убедитесь, что звуковой сигнал функции включен в вашу компиляцию или компоновку.

Первый шаг - убедиться, что вы компилируете все полученные файлы и связываете все поддерживаемые .lib's

Если это не работает, вы можете просто добавить метод самостоятельно;)

void beep() {
  printf ("beep\n");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...