Передача функции в другую функцию в C. Что я делаю не так? - PullRequest
1 голос
/ 19 марта 2009

У меня есть код на C, над которым я работаю, и похоже, что он должен работать. Когда я пытаюсь связать объектные файлы, я получаю сообщение об ошибке «неопределенная ссылка на outputBus» и так далее для каждого из них в функции getLine в main. Я пробовал с и без амперсанда перед именами функций. составление с gcc -ansi. Что я делаю не так?

typedef void(*DualOutput)(const int, const int);
typedef void(*TripleOutput)(const int, const int, const double);

void   passenger(node**, node**, itemtype*);
double bus(node**, node**, itemtype*);
int    getLine(itemtype*, DualOutput, DualOutput);
void   getLines(node**, node**, DualOutput, DualOutput, TripleOutput);
void   outputBus(const int, const int);
void   outputPeople(const int, const int);
void   outputTotal(const int, const int, const double);

int main(int argc, char **argv){
  node *head = NULL;
  node *tail = NULL;

  getLines(&head, &tail, outputBus, outputPeople, outputTotal);
  return 0;
} 

Ответы [ 4 ]

9 голосов
/ 19 марта 2009

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

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

1 голос
/ 19 марта 2009

Вы объявили функции, но нигде их не реализуете. Это просто объявляет функцию:

void   outputBus(const int, const int);
1 голос
/ 19 марта 2009

Некоторые "это подключено?" введите вопросы, чтобы начать:

  • Реализовали ли вы где-нибудь функции outputBus(), outputPeople() и outputTotal()?

  • Если да, был ли этот модуль включен в ссылку?

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

1 голос
/ 19 марта 2009

«Неопределенная ссылка» - ошибка компоновщика, означающая, что компоновщик не может найти реализацию метода. Если это определено в отдельном исходном файле, вы компилируете и связываете их вместе? Если это в библиотеке, вы ссылаетесь на библиотеку (с опцией -cc для lffoo gcc)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...