Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Описание модулей

Автор: Zas 25.03.2007 22:05

Объясните пожалуйста как нужно использовать модули в Си?
Я создаю файл к примеру List.h в нем пишуб к примеру:

#ifndef List_h
#define List_h
typedef
struct _elem {

int info;
struct _elem *next;

} elem, *pt;

extern int getelem(char *elname);
extern void addtobegin(pt *list, int info);
extern void addafter(pt listel, int info);
extern void addtoend(pt *list, int info);
extern void addbefore(pt listel, int info);
extern void delfirstel(pt *list);
extern void dellastel(pt *list);
extern void delel(pt *list, pt el);
extern void delbefore(pt *list, int info);
extern void delafter(pt *list, int info);
extern void printlist(pt list);
extern void checkel(pt list, int info);
extern void listclear(pt *list);
extern void showmenu();

#endif

Потом создаю файл List.c, где описываю все функции:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include "List.h"
typedef
struct _elem {

int info;
struct _elem *next;

} elem, *pt;
...


И в основном файле программы пишу:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include "List.h"
int main() {...
При компиляции в Dev c++ пишет, что неопределенное обращение к функциям....

Автор: volvo 25.03.2007 22:41

Почему прототипы описаны как extern? Попробуй убрать это слово... Это первое. Второе - зачем ты ту же самую структуру определяешь и в *.H файле, и в *.C файле? Из *.С файла убери ее определение...

Автор: Zas 25.03.2007 22:57

Спасибо, но выдает те же самые ошибки: Linker error undefined reference to название процедуры

Автор: volvo 25.03.2007 23:03

А ты подключил свой C-файл к проекту?

То, что ты сделал include файла *.H, это прекрасно, и это помогает компилятору откомпилировать основную программу (так как компилятору достаточно знать прототип функции, а не ее определение).

А вот линкер поднимает тревогу, потому как он должен получить уже все модули откомпилированными в OBJ-файлы, чтобы из них собрать EXE... А у тебя как видно есть только ОBJ основного файла, а LIST.OBJ не создался?

Автор: Zas 25.03.2007 23:07

при компиляции создаются файлы *.o *.obj нету.

Автор: volvo 26.03.2007 13:31

Цитата
при компиляции создаются файлы *.o
Да какая разница, что создается при компиляции? У тебя может и *.o, у других obj ... Что за привычка, основное не заметить, и начать придираться к малому? Я вопрос задал: ты C-файл к проекту подключил?