Modulares Programmieren

  • Bis jetzt habe ich in C immer mehr oder weniger unsauber dahinprogrammiert.
    Jetzt würde ich gerne wissen, wie man am besten "modular programmiert".
    Das heißt, eine sinnvolle Auftrennung der Anwendung in abgeschlossene Teilbreiche, damit man diese dann problemlos einzeln weiterverwenden könnte.

    Inkludiert man am besten die c-Dateien selbst oder doch die header-Dateien in denen die Funktionsrümpfe mit "extern" deklariert sind?
    Was ist mit mehrfacher Inkludierung? Das könnte eventuell Probleme geben, nicht? Hilft da wirklich einfach ein "ifndef ... define ... endif" Block?

    Ein Nachteil ist ja auch, dass man beim Aufteilen einer Anwendung im Makefile nicht mehr sowas wie "gcc *.c" verwenden kann, sondern immer speziell anpassen muss.

    Ich würde mich über Tipps bzw. Links freuen, da ich nix gscheites gefunden habe.

  • Inkludiert man am besten die c-Dateien selbst oder doch die header-Dateien in denen die Funktionsrümpfe mit "extern" deklariert sind?


    Üblicherweise nur Headers, der Linker soll auch ein bissi arbeiten dürfen :) Außerdem, je weniger Code auf einmal neu kompiliert werden muß, umso besser. (Wenn ich das richtig im Kopf hab, ist extern übrigens fast nie nötig, da default. Ist aber eine nette Annotation, also warum nicht.)

    Du kannst die Funktionen, die nur innerhalb einer Source-Datei relevant sind, übrigens als static deklarieren, dann kann man nicht von außerhalb gegen sie linken, selbst wenn man wollte. (Wiederum wenn ich das richtig im Kopf hab... Schwimmen macht müde.)

    Zitat

    Was ist mit mehrfacher Inkludierung? Das könnte eventuell Probleme geben, nicht? Hilft da wirklich einfach ein "ifndef ... define ... endif" Block?


    Ja, das hilft wirklich, wieso auch nicht? Solang ein Header übrigens nur Deklarationen ohne Definitionen oder Makros enthält, ist mehrfache Inkludierung übrigens kein Problem, aber die Guards kosten nichts.

    Zitat

    Ein Nachteil ist ja auch, dass man beim Aufteilen einer Anwendung im Makefile nicht mehr sowas wie "gcc *.c" verwenden kann, sondern immer speziell anpassen muss.


    Der Vorteil von make ist ja gerade, daß nicht immer alles neu übersetzt werden muß. Aber ja, Dependencies verwalten ist ein Hund. Wenn man aber mal wirklich alles neu builden will, ein "make clean; make" tippt sich fast so schnell :)

    *plantsch*

  • Der Vorteil von make ist ja gerade, daß nicht immer alles neu übersetzt werden muß. Aber ja, Dependencies verwalten ist ein Hund. Wenn man aber mal wirklich alles neu builden will, ein "make clean; make" tippt sich fast so schnell :)


    Genau für die Verwaltung der Dependencies gibt es ja "gcc -MM foo.c"

    Why bother spending time reading up on things? Everybody's an authority, in a free land.

  • Also defines nie ins header-file?

    -MM muss ich mal probieren. - Nimmt der Compiler dann automatisch alle Abhängigkeitsdateien mit rein oder wie ist das zu verstehen?

  • Also defines nie ins header-file?

    -MM muss ich mal probieren. - Nimmt der Compiler dann automatisch alle Abhängigkeitsdateien mit rein oder wie ist das zu verstehen?


    Doch, Defines, die auch außerhalb (also in anderen Sourcefiles bzw. "Modulen") Sinn machen, in die Headerdatei.
    -MM gibt nur die Dependencies im Format wie bei einem Makefile aus, was aber eben die Verwaltung der Dependencies vereinfacht, weil sie sich auf maximal copy&paste reduziert.

    Why bother spending time reading up on things? Everybody's an authority, in a free land.

  • -MM gibt nur die Dependencies im Format wie bei einem Makefile aus, was aber eben die Verwaltung der Dependencies vereinfacht, weil sie sich auf maximal copy&paste reduziert.


    Naja, wenn ich Libraries mit vielen Headern verwende (und das muß ich persönlich nun mal), ist nach -MM noch ein wenig Postprocessing angesagt, also ist nichts mit copy & paste. Außerdem muß man gcc -MM nach Änderungen auch händisch laufen lassen, das ist nicht der Gipfel der Automation :) Sicher ein Schritt in die richtige Richtung, aber einige Sachen bleiben doch ungelöst.

    *plantsch*

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!