У меня есть этот простой тестовый файл:неопределенная ссылка на <имя функции>
#include "stack.h"
int main()
{
Stack* stck = init_stack();
return 0;
}
и stack.h
определяется следующим образом:
#ifndef STACK_H
#define STACK_H
#define EMPTY_STACK -1
typedef struct stack
{
char ch;
struct stack* prev;
} Stack;
extern Stack* init_stack();
extern char pop(Stack*);
extern void push(Stack*, char);
#endif
Эти два файла находятся в одном каталоге. Но когда я gcc ..
построить его, я получаю ошибку ниже:
$ ls
stack.c stack.h teststack.c
$ gcc -o testit teststack.c
/tmp/ccdUD3B7.o: In function `main':
teststack.c:(.text+0xe): undefined reference to `init_stack'
collect2: ld returned 1 exit status
Может кто-нибудь сказать мне, что я сделал не так?
Спасибо,
Как узнать, где должно использоваться определение 'init_stack', которое должно использоваться? Хотя он включает в себя C++, этот вопрос, вероятно, поможет вам: http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-how-do-i- fix – chris
Обратите внимание, что 'extern Stack * init_stack();' - совсем другое объявление из 'extern Stack * init_stack (void);'. Первый говорит, что есть функция, но список аргументов не указан (это не переменная функция аргументов, но количество и типы аргументов не указаны). Второй говорит, что функция не принимает аргументов. Не используйте пустую запись в скобках в C. Обратите внимание, что в C++ пустые круглые скобки означают то же самое, что и '(void)'. –
@JonathanLeffler О, ничего себе! Я этого никогда не знал! Я всегда считал, что '(void)' просто причудливый способ '()'. Благодаря! – user1508893