Wird in öffentlichen Header-Dateien Konditionalität vorausgesetzt?

9

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.)

    
Steve 09.03.2012, 18:34
quelle

3 Antworten

3

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.

    
Luchian Grigore 09.03.2012 18:43
quelle
1

Ich denke, es gibt 2 gültige Ansätze für dieses Problem

  • Haben Sie eine einzelne Header-Datei, die #ifdef verwendet, um Funktionen zu entfernen, die in bestimmten Konfigurationen nicht unterstützt werden
  • Haben mehrere Header-Dateien ohne #ifdef , von denen jede für eine Konfiguration
  • spezifisch ist

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.

    
JaredPar 09.03.2012 18:41
quelle
1

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.

    
EdwardH 09.03.2012 20:36
quelle

Tags und Links