it-swarm.com.de

Ordnerstruktur für ein C-Projekt

Ich frage mich, welche Ordnerstruktur für ein C-Projekt empfohlen wird. Ich habe mehrere Beiträge über die Verwendung von src gelesen, Include, Test, Build-Ordner. Was aber, wenn ich das Projekt in Modulen strukturieren möchte?

Soll ich eine Struktur verwenden wie:

src/
    core/
        main.c
        sysinit.c
        interrupts.c
        ...
    module1/
        file1_1.c
        ...
    module2/
        file2_1.c
        ...

include/
    core/
        main.h
        sysinit.h
        interrupts.h
        ...
    module1/
        file1_1.h
        ...
    module2/
        file2_1.h
        ...

oder so:

core/
    src/
        main.c
        sysinit.c
        interrupts.c
    include/
        main.h
        sysinit.h
        interrupts.h
        ...
module1/
    src/
        file1_1.c
        ...
    include/
        file1_1.h
        ...
module2/
    src/
        file2_1.c
        ...
    include/
        file2_1.h
        ...

Wenn die beiden vorherigen Muster nicht empfohlen werden, welche Konventionen/häufig verwendeten Muster gibt es?

3
Mat.R

Beides ist möglich. Wenn Sie also einen Grund finden, einen Ansatz anstelle des anderen zu verwenden, fahren Sie fort.

Ich würde den zweiten Ansatz verwenden (Verzeichnisse der obersten Ebene sind Core, Modul1, Modul2 usw.), wenn die verschiedenen Module für sich genommen etwas nützlich sind (außer vielleicht das "Core" -Modul, wenn jedes andere Modul davon abhängt.)

Wenn alle Module voneinander abhängen und die einzelnen Module ohne die anderen Module unbrauchbar sind, verwenden Sie den ersten Ansatz (Verzeichnisse der obersten Ebene sind src, include usw.).

Beispiel 1 :

Sie haben 4 Module für ein kleines CRM-System (Offline Customer Relationship Management):

  • "Infrastruktur" - enthält Protokollierung, grundlegende Datentypen und einige Funktionen zum Abstrahieren von Plattformabhängigkeiten
  • "Domain" - enthält Geschäftslogik
  • "gui" - enthält die gui und baut auf "infrastructure" und "domain" auf
  • "cli" - enthält eine Befehlszeilenschnittstelle, die auch auf "Infrastruktur" und "Domäne" aufbaut.

In diesem Fall würde ich den ersten Ansatz verwenden (Verzeichnisse der obersten Ebene sind src, include usw.). Die verschiedenen Teile können nicht wirklich separat verwendet werden, sie sind alle miteinander verbunden. Möglicherweise wird der Ordner "Infrastruktur" ohne die anderen Ordner kompiliert, aber wie können Sie die resultierende .. Bibliothek verwenden?

Beispiel 2 :

Sie haben 5 Module für ein Dokumentenverwaltungssystem, das beliebige Dateien liest und in ein gemeinsames Format konvertiert:

  • base - enthält die grundlegenden Datentypen und die Plattformunterstützung
  • tabellenkalkulationen - Ermöglicht das Parsen von Excel- und Openoffice-Tabellenkalkulationen
  • pdfparser - kann PDF und PS-Dateien lesen
  • bildscanner - Liest JPG-, PNG- und TIFF-Dateien, um OCR mit ihnen zu machen
  • converttools - kann 90 verschiedene Dateiformate in allgemeinere unterstützte Dateiformate konvertieren

In diesem Fall würde ich den zweiten Ansatz verwenden (Verzeichnisse der obersten Ebene sind Core, Modul1, Modul2 usw.) - Alle Module können eigenständig verwendet werden und sind nützlich (mit Ausnahme des "Basis" -Moduls natürlich). Die verschiedenen Module sind etwas entkoppelt und in separate Verzeichnisse gestellt, wird allen klar mitgeteilt, dass dies eine grundlegende Entwurfsentscheidung ist.


Wenn Sie Beispiele erstellen, ist es gut, wirklich realistische Beispiele zu erstellen. Dies macht die Antwort viel offensichtlicher. Schlechte Beispiele sind jedoch so häufig. Ein reales Projekt hat niemals Module mit den Namen "Modul1" und "Modul2". Ohne zu wissen, was die Module sind, ist es nicht möglich zu wissen, ob Ansatz 1 oder Ansatz 2 besser ist.

3
Michael