Wie soll ich den quellcode auf Dateien auteilen?
-
Hi Leute,
ich habe mal eine Frage, was die modulisierung unter C angeht.
Wie teile ich den Code effektiv auf Dateien auf?
(Meine Frage hierzu steht weiter unten)Bsp:
/* list.h */ #ifndef LIST_H #define LIST_H typedef struct list_element_{ void * data; struct list_element_ *next; } list_element; typedef struct list_ { long count; /* 1 fuer 1 element */ list_element * head; list_element * tail; int (*compare)(void *, void *, long); /* 1 wenn gleich 0 sonnst */ void (*destroyfunc)(void *); } list; extern void list_init(list * this_list, void (*destroyfunc)(void *), int (*compare)(void *, void*, long)); extern int list_destroy(list * this_list); extern list_element * list_new_element(list * this_list, void * data); extern list_element * list_insert_unique(list * this_list, void * data, long size); /* NULL wenn daten noch nicht exestierten */ extern list_element * list_get_element(list * this_list, long position); #define ELEMENT_DATA(e) e->data #define ELEMENT_NEXT(e) e->next #define LIST_COUNT(l) l->count #define LIST_SIZE(l) LIST_COUNT(l) #define LIST_HEAD(l) l->head #define LIST_FIRST(l) LIST_HEAD(l) #define LIST_TAIL(l) l->tail #define LIST_LAST(l) LIST_TAIL(l) #define LIST_DESTROY(l) l->destroyfunc #define LIST_COMPARE(l) l->compare #endif /* LIST_H */
und das abstamende modul:
/* strlist.h */ #include <stdlib.h> #include <stdio.h> #include "list.h" #ifndef STRLIST_H #define STRLIST_H typedef list strlist; extern void strlist_init(strlist *this_list); extern int strlist_destroy(strlist * this_list); extern list_element * strlist_new_element(strlist * this_list, char * string); extern list_element * strlist_insert_unique(strlist * this_list, char * string); extern void strlist_print(strlist * this_list, char *prefix, char *postfix, FILE * file); #endif
Diese Module kann ich bequem mit diesen befhlen kompilieren und linken:
# gcc -c list.*
# gcc -c strlist.*
# gcc -o progname main.c list.o strlist.oFragen:
1.)reicht es aus, wenn ich in strlist.c nur strlist.h einbinde oder muss ich auch noch list.h einbinden?
2.)Wenn ich auf list.h in strlist.c verzichte, sind in strlist.c dennoch die funktionen aus list.h/list.c drinn verfügbar? Immerhin wurde ja list.h in strlist.h eingebunden.
3.)Oder sollte ich auf das hierarchische einbinden der header verzichten, und in jedem modul komplet alles was in der hierarchie irgendwo druntersteht einbinden?
zb:
main.c -> includes: list.h strlist.h stdio.h stdlib.h
strlist.c -> includes: list.h strlist.h stdio.h stdlib.h
strlist.h -> includes: list.h strlist.h stdio.h stdlib.h
list.c -> includes: list.h stdio.h stlib.h
list.h -> includes: stdio.h stdlib.hauf welche der Includes kann ich verzichten?
Zu beachten ist, dass strlist von list abgeleitet wurde, und wenn ich strlist.h nutze will ich dennoch auf die makros aus list.h zugreifen.
4.)Muss ich die includes innerhalb von
#ifndef LIST_H
#define LIST_H
#include <stdio.h>
#include <....
#endifoder doch eher davor? Wo ist der unterschied?
Für Eure Antwort wäre ich Euch sehr dankbar
Gruß :xmas1:
-
1./2. list.h wird ja bereits in strlist.h eingebunden, also auch in dateien, die strlist.h einbinden. Der C Preprozessor ist stupide und besitzt keine eigen Intelligenz.
3. Includiere das was du nur wirklich brauchst. stdlib.h brauchst du ja nicht in list.h, daher includiere das auch nicht. Includiere nicht mehr als nötig aber auch nicht weniger.
4. Naja, wenn die Header vor dem Include Wächter stehen, muss der Compiler für jeden Header noch einmal unnötiger weise den Include Wächter überprüfen => längere Compilezeit
-
Vielen Dank für Deine Antwort
Du hast mir sehr geholfen
Gruß
-
Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Linux/Unix in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.