Meine C-Bibliothek hat einige optionale Funktionen, und mit automake kann der Benutzer sie ein- und ausschalten, indem er Flags zum Konfigurieren bereitstellt.
Wenn ein Feature deaktiviert ist, wird diese Funktion nicht kompiliert.
Meine Frage ist jedoch, sollte ich in diesem Fall auch den Funktionsprototyp aus den öffentlichen Headern entfernen?
Es scheint keine gute Idee zu sein, Funktionsprototypen für Funktionen zu haben, die nicht kompiliert werden, aber es scheint mir auch keine gute Idee zu sein, verschiedene öffentliche Header zu installieren, abhängig von der Bibliothekskonfiguration. (Ähnlich wie es ist eine schlechte Praxis, config.h
im öffentlichen Header-Verzeichnis zu installieren.)
Was ist der beste Ansatz für öffentliche Header, wenn es um optionale Funktionen geht? Wenn ein Benutzer versucht, eine deaktivierte Funktion zu verwenden, sollte der Fehler zur Kompilierungszeit oder zur Verbindungszeit kommen? Es muss eine Standardpraxis für diese Situation geben. (Ich bevorzuge die Einhaltung der GNU-Codierungsstandards, wenn es mehrere Ideen gibt, aber ich kenne den GNU-Standard zu diesem Thema nicht.)
Schließe definitiv nicht nur die Implementierung von der Kompilierung aus, sondern die gesamte Funktion.
%Vor% Auf diese Weise erhalten Sie einen Compiler- und keinen Linker-Fehler, wenn Sie versuchen, foo
mit der ausgeschlossenen Funktion zu verwenden. Sie möchten so schnell wie möglich einen Fehler melden, Linker-Fehler übertragen im Allgemeinen weniger über die Absicht des Entwicklers.
Microsoft tut dies (Bedingungen in Header-Dateien) für MFC und es funktioniert ganz gut. (natürlich ist das C ++, aber das Prinzip steht.
Ich denke, es gibt 2 gültige Ansätze für dieses Problem
#ifdef
verwendet, um Funktionen zu entfernen, die in bestimmten Konfigurationen nicht unterstützt werden #ifdef
, von denen jede für eine Konfiguration Es scheint eine wirklich schlechte Übung zu sein, Funktionen zu belassen, die nicht in der lib in der Header-Datei für eine bestimmte Konfiguration vorhanden sind. Es dauert einen Fehler bei der Kompilierung und verschiebt es in einen Linker.
Ich habe in einigen Projekten folgende Vorgehensweise beobachtet: Erzeugen Sie die Header-Datei aus einer Vorlage.
Die Dateigenerierung basiert auf den Konfigurationsflags.
Diese Herangehensweise schien mir sauberer zu sein als die Verwendung endloser Bedingungsdefinitionen im Header ... für mich scheint es viel sauberer zu sein.
Nachteil: Es kann eine Unterstützung (für das Skript) sein.
Tags und Links c shared-libraries gnu automake