Wir haben eine C++-Vorlagenbibliothek, die einige Funktionen hat, die zum Beispiel von zlib abhängen. Wir aktivieren und deaktivieren selektiv Funktionen mit Hilfe von Präprozessorsymbolen, d.h. wir setzen -DHAVE_ZLIB=1
in der Befehlszeile.
Unser CMake-basiertes Build-System erkennt die installierte zlib und fügt dem Compiler das entsprechende Flag hinzu. Natürlich kann dies auch manuell von den Benutzern mit ihrer bevorzugten IDE oder ihren Makefiles durchgeführt werden.
Eine Eigenschaft der Bibliothek ist, dass der Code, der zlib verwendet, mit dem Code, der zlib nicht verwendet, verschachtelt ist, d. h. mit #include <library/header.h>
sollte unabhängig davon funktionieren, ob zlib vorhanden ist oder nicht.
Derzeit sind wir #if
aus Code, der von zlib abhängt. Wenn der Benutzer also versucht, etwas zu verwenden wie CompressedStream
wird die Klasse zum Beispiel einfach nicht gefunden. Das ist für die Benutzer ziemlich frustrierend. Das Build-System warnt sie, dass zlib nicht gefunden werden konnte, aber Benutzer sind Benutzer und sehen das entweder nicht oder vergessen es schnell. Ich selbst bin auch schon in diese Falle getappt.
Nun zu meiner Frage: Was ist der beste Weg, um den Benutzer zu warnen, dass zlib deaktiviert ist, wenn er versucht, Code zu verwenden, der zlib benötigt.
Das Einzige, was mir einfällt, ist die Verwendung der in vielen Compilern implementierten Mechanismen zur Markierung von Fehlern. Obwohl für jeden von ihnen eine andere Syntax erforderlich ist, könnte dies leicht durch Präprozessormakros abstrahiert werden. Gibt es eine andere gute Möglichkeit?
Die Lösung muss nur in VS >8, GCC >4.2 und LLVM funktionieren.