Ist es eine gute Praxis, C ++ - Definitionen in Header-Dateien zu platzieren?

196

Mein persönlicher Stil mit C ++ besteht immer darin, Klassendeklarationen in eine Include-Datei und Definitionen in eine CPP-Datei einzufügen, ähnlich wie in Lokis Antwort auf C ++ - Header-Dateien, Codetrennung . Zugegeben, ein Teil des Grundes, warum ich diesen Stil mag, hat wahrscheinlich mit all den Jahren zu tun, die ich mit dem Codieren von Modula-2 und Ada verbracht habe. Beide haben ein ähnliches Schema mit Spezifikationsdateien und Body-Dateien.

Ich habe einen Kollegen, der sich in C ++ viel besser auskennt als ich, und der darauf besteht, dass alle C ++ - Deklarationen, wo möglich, die Definitionen genau dort in die Header-Datei aufnehmen. Er sagt nicht, dass dies ein gültiger alternativer Stil oder sogar ein etwas besserer Stil ist, sondern dass dies der neue allgemein akzeptierte Stil ist, den jetzt jeder für C ++ verwendet.

Ich bin nicht mehr so ​​geschmeidig wie früher, also bin ich nicht wirklich darauf bedacht, auf seinen Zug zu klettern, bis ich dort oben noch ein paar Leute mit ihm sehe. Wie häufig ist diese Redewendung wirklich?

Nur um den Antworten eine gewisse Struktur zu geben: Ist es jetzt The Way , sehr häufig, etwas häufig, ungewöhnlich oder verrückt nach Bug-Outs?

TED
quelle
Einzeilige Funktionen (Getter und Setter) im Header sind üblich. Länger als ein fragender zweiter Blick. Vielleicht für die vollständige Definition einer kleinen Klasse, die nur von einer anderen im selben Header verwendet wird?
Martin Beckett
Ich habe bisher immer alle meine Klassendefinitionen in Überschriften eingefügt. Ausnahmen sind nur Definitionen für Pimpl-Klassen. Ich deklariere nur die in Headern.
Johannes Schaub - litb
3
Vielleicht denkt er, dass es so ist, weil Visual C ++ so darauf besteht, dass Code geschrieben wird. Wenn Sie auf eine Schaltfläche klicken, wird die Implementierung in der Header-Datei generiert. Ich weiß nicht, warum Microsoft dies aus den Gründen, die andere unten erklärt haben, fördern würde.
WKS
4
@WKS - Microsoft möchte lieber, dass jeder in C # programmiert, und in C # gibt es keine Unterscheidung zwischen "Header" und "Body", es ist nur eine Datei. Der C # -Weg ist schon lange sowohl in der C ++ - als auch in der C # -Welt vorhanden und daher viel einfacher zu handhaben.
Mark Lakata
1
@ MarkLakata - Das ist in der Tat eines der Dinge, auf die er hingewiesen hat. Ich habe dieses Argument in letzter Zeit nicht von ihm gehört, aber IIRC argumentierte, dass Java und C # auf diese Weise funktionieren, und C # war zu dieser Zeit brandneu, was es zu einem Trend machte, dem alle Sprachen bald folgen werden
TED

Antworten:

209

Ihr Mitarbeiter ist falsch, der übliche Weg war und ist es, Code in CPP-Dateien (oder eine beliebige Erweiterung) und Deklarationen in Headern einzufügen.

Es ist gelegentlich sinnvoll, Code in den Header einzufügen. Dies kann ein geschickteres Inlining durch den Compiler ermöglichen. Gleichzeitig kann dies Ihre Kompilierungszeiten zerstören, da der gesamte Code jedes Mal verarbeitet werden muss, wenn er vom Compiler aufgenommen wird.

Schließlich ist es oft ärgerlich, kreisförmige Objektbeziehungen zu haben (manchmal erwünscht), wenn der gesamte Code die Überschriften sind.

Fazit: Sie hatten Recht, er liegt falsch.

EDIT: Ich habe über Ihre Frage nachgedacht. Es gibt einen Fall, in dem das, was er sagt, wahr ist. Vorlagen. Viele neuere "moderne" Bibliotheken wie Boost verwenden häufig Vorlagen und sind häufig "nur Header". Dies sollte jedoch nur beim Umgang mit Vorlagen erfolgen, da dies die einzige Möglichkeit ist, dies beim Umgang mit Vorlagen zu tun.

EDIT: Einige Leute möchten etwas mehr Klarheit, hier sind einige Gedanken zu den Nachteilen beim Schreiben von "nur Header" -Code:

Wenn Sie sich umschauen, werden Sie eine Menge Leute sehen, die versuchen, einen Weg zu finden, um die Kompilierungszeiten beim Umgang mit Boost zu verkürzen. Beispiel: So reduzieren Sie die Kompilierungszeiten mit Boost Asio , bei dem eine 14-Sekunden-Kompilierung einer einzelnen 1K-Datei mit Boost angezeigt wird. 14s scheinen nicht "explodieren" zu sein, aber es ist sicherlich viel länger als typisch und kann sich ziemlich schnell summieren. Bei einem großen Projekt. Nur-Header-Bibliotheken wirken sich auf messbare Weise auf die Kompilierungszeiten aus. Wir tolerieren es einfach, weil Boost so nützlich ist.

Darüber hinaus gibt es viele Dinge, die nicht nur in Headern ausgeführt werden können (selbst Boost enthält Bibliotheken, mit denen Sie für bestimmte Teile wie Threads, Dateisysteme usw. verknüpfen müssen). Ein primäres Beispiel ist, dass Sie keine einfachen globalen Objekte in nur Header-Bibliotheken haben können (es sei denn, Sie greifen auf den Gräuel zurück, der ein Singleton ist), da Sie auf mehrere Definitionsfehler stoßen. HINWEIS: Mit den Inline-Variablen von C ++ 17 kann dieses Beispiel in Zukunft ausgeführt werden.

Als letzter Punkt wird bei Verwendung von Boost als Beispiel für Nur-Header-Code häufig ein großes Detail übersehen.

Boost ist eine Bibliothek, kein Code auf Benutzerebene. so oft ändert es sich nicht. Wenn Sie im Benutzercode alles in Kopfzeilen einfügen, müssen Sie bei jeder kleinen Änderung das gesamte Projekt neu kompilieren. Das ist eine enorme Zeitverschwendung (und gilt nicht für Bibliotheken, die sich nicht von Kompilieren zu Kompilieren ändern). Wenn Sie Dinge zwischen Header / Quelle und noch besser aufteilen und Forward-Deklarationen verwenden, um Includes zu reduzieren, können Sie Stunden der Neukompilierung sparen, wenn Sie diese über einen Tag addieren.

Evan Teran
quelle
16
Ich bin mir ziemlich sicher, dass er es dort bekommt. Wann immer dies auftaucht, ruft er Vorlagen auf. Sein Argument ist ungefähr, dass Sie den gesamten Code auf diese Weise aus Gründen der Konsistenz ausführen sollten.
TED
14
Das ist ein schlechtes Argument, das er vorbringt, bleib bei deinen Waffen :)
Evan Teran
11
Vorlagendefinitionen können in CPP-Dateien enthalten sein, wenn das Schlüsselwort "export" unterstützt wird. Das ist eine dunkle Ecke von C ++, die nach meinem besten Wissen von den meisten Kompilierungen normalerweise nicht einmal implementiert wird.
Andrei Taranchenko
2
Ein Beispiel finden Sie unten in dieser Antwort (oben ist etwas verworren): stackoverflow.com/questions/555330/…
Evan Teran
3
Es beginnt für diese Diskussion unter "Hurra, keine Linkerfehler" von Bedeutung zu sein.
Evan Teran
157

An dem Tag, an dem sich C ++ - Programmierer auf The Way einigen , werden sich Lämmer mit Löwen hinlegen, Palästinenser werden Israelis umarmen und Katzen und Hunde dürfen heiraten.

Die Trennung zwischen .h- und .cpp-Dateien ist zu diesem Zeitpunkt meist willkürlich, ein Überbleibsel von Compiler-Optimierungen, die längst vorbei sind. Aus meiner Sicht gehören Deklarationen in den Header und Definitionen in die Implementierungsdatei. Aber das ist nur Gewohnheit, keine Religion.

Ja - dieser Jake.
quelle
140
"Der Tag, an dem sich C ++ - Codierer auf The Way einigen ..." Es wird nur noch einen C ++ - Codierer geben!
Brian Ensink
9
Ich dachte , sie schon auf dem Weg zustimmen, Erklärungen in .h und Definitionen in CPP
hasen
6
Wir sind alle Blinde und C ++ ist ein Elefant.
Roderick Taylor
Gewohnheit? Wie wäre es also mit .h, um den Umfang zu definieren? durch welches Ding wurde es ersetzt?
Hernán Eche
28

Code in Headern ist im Allgemeinen eine schlechte Idee, da er die Neukompilierung aller Dateien erzwingt, die den Header enthalten, wenn Sie den tatsächlichen Code anstelle der Deklarationen ändern. Dies verlangsamt auch die Kompilierung, da Sie den Code in jeder Datei analysieren müssen, die den Header enthält.

Ein Grund für Code in Header-Dateien besteht darin, dass das Schlüsselwort inline im Allgemeinen ordnungsgemäß funktioniert und Vorlagen verwendet werden, die in anderen CPP-Dateien instanziiert werden.

Laserallan
quelle
1
"Es erzwingt die Neukompilierung aller Dateien, die den Header enthalten, wenn Sie den tatsächlichen Code anstelle der Deklarationen ändern." Ich denke, dies ist der echteste Grund. Dies geht auch mit der Tatsache einher, dass sich Deklarationen in Headern weniger häufig ändern als die Implementierung in .c-Dateien.
Ninad
20

Was Sie möglicherweise als Mitarbeiter informiert, ist die Vorstellung, dass der meiste C ++ - Code als Vorlage verwendet werden sollte, um maximale Benutzerfreundlichkeit zu gewährleisten. Und wenn es als Vorlage dient, muss sich alles in einer Header-Datei befinden, damit der Client-Code es sehen und instanziieren kann. Wenn es gut genug für Boost und die STL ist, ist es gut genug für uns.

Ich stimme diesem Standpunkt nicht zu, aber es kann sein, woher er kommt.

JohnMcG
quelle
Ich denke, Sie haben Recht damit. Wenn wir es diskutieren ist er immer das Beispiel mithilfe von Vorlagen, wo Sie mehr oder weniger haben , dies zu tun. Ich bin auch nicht mit dem "Muss" einverstanden, aber meine Alternativen sind ziemlich verworren.
TED
1
@ted - Für Vorlagencode müssen Sie die Implementierung in den Header einfügen. Das Schlüsselwort 'export' ermöglicht es einem Compiler, die Trennung von Deklaration und Definition von Vorlagen zu unterstützen, aber die Unterstützung für den Export ist so gut wie nicht vorhanden. anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1426.pdf
Michael Burr
Ein Header, ja, aber es muss nicht der gleiche Header sein. Siehe die Antwort von unbekannt unten.
TED
Das macht Sinn, aber ich kann nicht sagen, dass ich diesen Stil schon einmal gesehen habe.
Michael Burr
14

Ich denke, Ihr Kollege ist schlau und Sie haben auch Recht.

Die nützlichen Dinge, die ich fand, wenn ich alles in die Überschriften stecke, sind:

  1. Keine Notwendigkeit, Header und Quellen zu schreiben und zu synchronisieren.

  2. Die Struktur ist einfach und keine kreisförmigen Abhängigkeiten zwingen den Codierer, eine "bessere" Struktur zu erstellen.

  3. Tragbar, einfach in ein neues Projekt einzubetten.

Ich bin mit dem Problem der Kompilierungszeit einverstanden, aber ich denke, wir sollten das beachten:

  1. Durch die Änderung der Quelldatei werden sehr wahrscheinlich die Header-Dateien geändert, was dazu führt, dass das gesamte Projekt erneut kompiliert wird.

  2. Die Kompilierungsgeschwindigkeit ist viel schneller als zuvor. Und wenn Sie ein Projekt haben, das mit langer Zeit und hoher Frequenz erstellt werden soll, kann dies darauf hinweisen, dass Ihr Projektdesign Fehler aufweist. Durch die Aufteilung der Aufgaben in verschiedene Projekte und Module kann dieses Problem vermieden werden.

Zuletzt möchte ich nur Ihren Kollegen unterstützen, nur aus meiner persönlichen Sicht.

XU Bin
quelle
3
+1. Niemand außer Ihnen hatte die Idee, dass in einem Header nur lange Kompilierungszeiten auf zu viele Abhängigkeiten hinweisen können, was ein schlechtes Design ist. Guter Punkt! Aber können diese Abhängigkeiten in einem Ausmaß entfernt werden, in dem die Kompilierungszeit tatsächlich kurz ist?
TobiMcNamobi
@TobiMcNamobi: Ich liebe die Idee des "Nachlassen", um ein besseres Feedback zu schlechten Designentscheidungen zu erhalten. Wenn wir uns jedoch auf diese Idee einigen, erhalten wir eine einzige Kompilierungseinheit und enorme Kompilierungszeiten. Auch wenn das Design eigentlich toll ist.
Jo So
Mit anderen Worten, die Trennung zwischen Schnittstelle und Implementierung ist tatsächlich Teil Ihres Designs. In C müssen Sie Ihre Entscheidungen zur Kapselung durch Trennung in Header und Implementierung ausdrücken.
Jo So
1
Ich fange an mich zu fragen, ob es überhaupt Nachteile gibt, wenn man nur die Überschriften ganz fallen lässt, wie es moderne Sprachen tun.
Jo So
12

Oft füge ich triviale Elementfunktionen in die Header-Datei ein, damit sie inline eingefügt werden können. Aber um den gesamten Code dort abzulegen, nur um mit Vorlagen konsistent zu sein? Das sind einfache Nüsse.

Denken Sie daran: Eine dumme Konsequenz ist der Hobgoblin der kleinen Köpfe .

Mark Ransom
quelle
Ja, das mache ich auch. Die allgemeine Regel, die ich verwende, scheint etwa so zu sein: "Wenn sie in eine Codezeile passt, lassen Sie sie in der Kopfzeile".
TED
Was passiert, wenn eine Bibliothek den Hauptteil einer Vorlagenklasse A<B>in einer CPP-Datei bereitstellt und der Benutzer dann eine wünscht A<C>?
JWW
@jww Ich habe es nicht explizit angegeben, aber Vorlagenklassen sollten vollständig in Headern definiert sein, damit der Compiler es mit den benötigten Typen instanziieren kann. Das ist eine technische Anforderung, keine stilistische Entscheidung. Ich denke, das Problem in der ursprünglichen Frage ist, dass jemand entschieden hat, ob es gut für Vorlagen ist, es ist auch gut für den regulären Unterricht.
Mark Ransom
7

Wie Tuomas sagte, sollte Ihr Header minimal sein. Um vollständig zu sein, werde ich etwas erweitern.

Ich persönlich verwende 4 Arten von Dateien in meinen C++Projekten:

  • Öffentlichkeit:
  • Weiterleitungsheader: Bei Vorlagen usw. erhält diese Datei die Weiterleitungsdeklarationen, die im Header angezeigt werden.
  • Header: Diese Datei enthält den Weiterleitungsheader, falls vorhanden, und deklariert alles, was ich öffentlich sein möchte (und definiert die Klassen ...).
  • Privat:
  • Privater Header: Diese Datei ist ein für die Implementierung reservierter Header. Sie enthält den Header und deklariert die Hilfsfunktionen / -strukturen (z. B. für Pimpl oder Prädikate). Bei Bedarf überspringen.
  • Quelldatei: Enthält den privaten Header (oder den Header, wenn kein privater Header vorhanden ist) und definiert alles (keine Vorlage ...)

Außerdem verbinde ich dies mit einer anderen Regel: Definieren Sie nicht, was Sie weiterleiten können. Obwohl ich dort natürlich vernünftig bin (Pimpl überall zu verwenden ist ein ziemlicher Aufwand).

Dies bedeutet, dass ich eine Vorwärtserklärung gegenüber einer #includeDirektive in meinen Kopfzeilen bevorzuge, wenn ich mit ihnen durchkommen kann.

Schließlich verwende ich auch eine Sichtbarkeitsregel: Ich beschränke die Bereiche meiner Symbole so weit wie möglich, damit sie die äußeren Bereiche nicht verschmutzen.

Alles in allem:

// example_fwd.hpp
// Here necessary to forward declare the template class,
// you don't want people to declare them in case you wish to add
// another template symbol (with a default) later on
class MyClass;
template <class T> class MyClassT;

// example.hpp
#include "project/example_fwd.hpp"

// Those can't really be skipped
#include <string>
#include <vector>

#include "project/pimpl.hpp"

// Those can be forward declared easily
#include "project/foo_fwd.hpp"

namespace project { class Bar; }

namespace project
{
  class MyClass
  {
  public:
    struct Color // Limiting scope of enum
    {
      enum type { Red, Orange, Green };
    };
    typedef Color::type Color_t;

  public:
    MyClass(); // because of pimpl, I need to define the constructor

  private:
    struct Impl;
    pimpl<Impl> mImpl; // I won't describe pimpl here :p
  };

  template <class T> class MyClassT: public MyClass {};
} // namespace project

// example_impl.hpp (not visible to clients)
#include "project/example.hpp"
#include "project/bar.hpp"

template <class T> void check(MyClass<T> const& c) { }

// example.cpp
#include "example_impl.hpp"

// MyClass definition

Der Lebensretter hier ist, dass der Forward-Header meistens unbrauchbar ist: nur für den Fall von typedefoder templateund ebenso für den Implementierungs-Header erforderlich ;)

Matthieu M.
quelle
6

Um mehr Spaß zu haben, können Sie .ippDateien hinzufügen , die die Vorlagenimplementierung enthalten (die in enthalten ist .hpp), während sie .hppdie Benutzeroberfläche enthalten.

Abgesehen von Vorlagencode (je nach Projekt kann dies die Mehrheit oder Minderheit der Dateien sein) gibt es normalen Code, und hier ist es besser, die Deklarationen und Definitionen zu trennen. Stellen Sie bei Bedarf auch Vorwärtsdeklarationen bereit - dies kann sich auf die Kompilierungszeit auswirken.

Anonym
quelle
Das habe ich auch mit Vorlagendefinitionen gemacht (obwohl ich nicht sicher bin, ob ich dieselbe Erweiterung verwendet habe ... es ist eine Weile her).
TED
5

Wenn ich eine neue Klasse schreibe, füge ich im Allgemeinen den gesamten Code in die Klasse ein, damit ich nicht in einer anderen Datei danach suchen muss. Nachdem alles funktioniert hat, zerlege ich den Hauptteil der Methoden in die cpp-Datei Lassen Sie die Prototypen in der HPP-Datei.

EvilTeach
quelle
4

Wenn dieser neue Weg wirklich der Weg ist , sind wir in unseren Projekten möglicherweise in eine andere Richtung gelaufen.

Weil wir versuchen, alle unnötigen Dinge in Headern zu vermeiden. Dazu gehört die Vermeidung von Header-Kaskaden. Code in Headern benötigt wahrscheinlich einen anderen Header, der einen anderen Header usw. benötigt. Wenn wir gezwungen sind, Vorlagen zu verwenden, versuchen wir zu vermeiden, dass Header zu viel mit Vorlagenmaterial übersät werden.

Wir verwenden auch das "undurchsichtige Zeiger" -Muster .

Mit diesen Methoden können wir schnellere Builds erstellen als die meisten unserer Kollegen. Und ja ... das Ändern von Code oder Klassenmitgliedern führt nicht zu großen Neuerstellungen.

Virne
quelle
4

Ich persönlich mache das in meinen Header-Dateien:

// class-declaration

// inline-method-declarations

Ich mag es nicht, den Code für die Methoden mit der Klasse zu mischen, da es mir schwer fällt, schnell nachzuschlagen.

Ich würde nicht ALLE Methoden in die Header-Datei einfügen. Der Compiler kann (normalerweise) keine virtuellen Methoden einbinden und wird (wahrscheinlich) nur kleine Methoden ohne Schleifen einbinden (hängt vollständig vom Compiler ab).

Das Ausführen der Methoden in der Klasse ist gültig ... aber aus lesbarer Sicht mag ich es nicht. Wenn Sie die Methoden in den Header einfügen, werden sie nach Möglichkeit inline.

TofuBeer
quelle
2

IMHO, er hat NUR Verdienst, wenn er Vorlagen und / oder Metaprogrammierung macht. Es gibt bereits viele Gründe, warum Sie Header-Dateien auf Deklarationen beschränken. Sie sind nur das ... Überschriften. Wenn Sie Code einfügen möchten, kompilieren Sie ihn als Bibliothek und verknüpfen ihn.

Spoulson
quelle
2

Ich habe die gesamte Implementierung aus der Klassendefinition entfernt. Ich möchte die Sauerstoffkommentare aus der Klassendefinition haben.

Jesus Fernandez
quelle
1
Ich weiß, dass es spät ist, aber Downvoter (oder Sympathisanten) möchten gerne kommentieren, warum? Dies scheint mir eine vernünftige Aussage zu sein. Wir verwenden Doxygen, und das Problem ist sicherlich aufgetreten.
TED
2

Ich finde es absolut absurd, ALLE Ihre Funktionsdefinitionen in die Header-Datei aufzunehmen. Warum? Weil die Header-Datei als PUBLIC-Schnittstelle zu Ihrer Klasse verwendet wird. Es ist die Außenseite der "Black Box".

Wenn Sie sich eine Klasse ansehen müssen, um zu verweisen, wie sie verwendet wird, sollten Sie sich die Header-Datei ansehen. Die Header-Datei sollte eine Liste der möglichen Funktionen enthalten (kommentiert, um die Details zur Verwendung der einzelnen Funktionen zu beschreiben) und eine Liste der Mitgliedsvariablen enthalten. Es sollte NICHT enthalten sein, wie jede einzelne Funktion implementiert wird, da dies eine Bootsladung unnötiger Informationen ist und nur die Header-Datei überfüllt.

SeanRamey
quelle
1

Hängt das nicht wirklich von der Komplexität des Systems und den internen Konventionen ab?

Im Moment arbeite ich an einem neuronalen Netzwerksimulator, der unglaublich komplex ist, und der akzeptierte Stil, den ich voraussichtlich verwenden werde, ist:

Klassendefinitionen
in classname.h Klassencode in classnameCode.h
ausführbarer Code in classname.cpp

Dies teilt die vom Benutzer erstellten Simulationen von den vom Entwickler erstellten Basisklassen auf und funktioniert in der jeweiligen Situation am besten.

Es würde mich jedoch überraschen, wenn Leute dies beispielsweise in einer Grafikanwendung oder einer anderen Anwendung tun, deren Zweck nicht darin besteht, Benutzern eine Codebasis zur Verfügung zu stellen.

Ed James
quelle
1
Was genau ist der Unterschied zwischen "Klassencode" und "ausführbarer Code"?
TED
Wie gesagt, es ist ein neuronaler Simulator: Der Benutzer erstellt ausführbare Simulationen, die auf einer großen Anzahl von Klassen basieren, die als Neuronen usw. fungieren. Unser Code besteht also einfach aus Klassen, die selbst nichts tun können, und der Benutzer erstellt den ausführbaren Code das bringt den Simulator dazu, Dinge zu tun.
Ed James
Könnten Sie im Allgemeinen nicht sagen, dass Sie für die überwiegende Mehrheit (wenn nicht die Gesamtheit) der meisten Programme nichts für sich tun können? Wollen Sie damit sagen, dass der "Haupt" -Code in einem CPP enthalten ist, aber sonst nichts?
TED
In dieser Situation ist es etwas anders. Der Code, den wir schreiben, ist im Grunde eine Bibliothek, und der Benutzer baut darauf seine Simulationen auf, die tatsächlich ausgeführt werden können. Stellen Sie sich das wie openGL vor -> Sie erhalten eine Reihe von Funktionen und Objekten, aber ohne eine CPP-Datei, die sie ausführen kann, sind sie nutzlos.
Ed James
0

Vorlagencode sollte nur in Kopfzeilen enthalten sein. Abgesehen davon sollten alle Definitionen außer Inlines in .cpp sein. Das beste Argument dafür wären die Standardbibliotheksimplementierungen, die der gleichen Regel folgen. Sie würden nicht widersprechen, dass die Entwickler von std lib diesbezüglich Recht haben würden.

Abhishek Agarwal
quelle
Welche stdlibs? GCC libstdc++scheint (AFAICS) setzt fast nichts srcund fast alles , was in include, ob es ‚Muss‘ in einem Header sein. Ich denke also nicht, dass dies ein genaues / nützliches Zitat ist. Wie auch immer, ich denke nicht, dass stdlibs ein Modell für Benutzercode sind: Sie werden offensichtlich von hochqualifizierten Codierern geschrieben, aber um verwendet zu werden , nicht gelesen: Sie abstrahieren hohe Komplexität, über die die meisten Codierer nicht nachdenken sollten , müssen _Reserved __namesüberall hässlich sein , um Konflikte mit dem Benutzer zu vermeiden, Kommentare und Abstände liegen unter dem, was ich empfehlen würde usw. Sie sind auf enge Weise beispielhaft.
underscore_d
0

Ich denke, Ihr Mitarbeiter hat Recht, solange er nicht in den Prozess zum Schreiben von ausführbarem Code in den Header eintritt. Ich denke, das richtige Gleichgewicht besteht darin, dem von GNAT Ada angegebenen Pfad zu folgen, in dem die ADS-Datei eine absolut angemessene Schnittstellendefinition des Pakets für seine Benutzer und für seine Kinder enthält.

Übrigens, Ted, haben Sie sich in diesem Forum die aktuelle Frage zur Ada-Bindung an die CLIPS-Bibliothek angesehen, die Sie vor einigen Jahren geschrieben haben und die nicht mehr verfügbar ist (relevante Webseiten sind jetzt geschlossen). Selbst wenn diese Bindung zu einer alten Clips-Version erstellt wurde, könnte sie ein gutes Startbeispiel für jemanden sein, der bereit ist, die CLIPS-Inferenz-Engine in einem Ada 2012-Programm zu verwenden.

Emile
quelle
1
Lol. 2 Jahre später ist dies eine seltsame Art, jemanden zu erreichen. Ich werde prüfen, ob ich noch eine Kopie habe, aber höchstwahrscheinlich nicht. Ich habe das für eine KI-Klasse gemacht, damit ich meinen Code in Ada machen konnte, aber dieses Projekt CC0 (im Wesentlichen nicht urheberrechtlich geschützt) absichtlich gemacht, in der Hoffnung, dass jemand es schamlos nimmt und etwas damit macht.
Ted