Ich stehe vor einem Problem, das ich nicht zu lösen weiß.Entfernen Sie die Precompiler-Anweisung aus der Header-Datei .h
Angenommen, die folgende typedef struct in eine test.h Header-Datei:
typedef struct example_struct {
#ifdef CONFIG_A
int A;
#endif;
int B;
} example_struct_t;
ich den Code bin der Zusammenstellung dieser Header-Datei mit dem GCC mit Option -D vorbei CONFIG_A. Auf diese Weise kann ich ein Mitglied in die Struktur aufnehmen oder entfernen, wenn es für einen bestimmten Anwendungsfall nicht benötigt wird.
Angenommen, ich erstelle eine gemeinsame Bibliothek (.so) und möchte sie verteilen. Also, ich habe die .so-Bibliothek und die Header mit Precompiler-Anweisungen. Das Problem ist, dass ich die -DCONFIG_A nicht in das Programm mit der Bibliothek aufnehmen möchte, ich meine, ich müsste die zum Zeitpunkt der Bibliothekszusammenstellung verwendeten Optionen nicht nur in den Quelldateien (.c), sondern auch in der Header. Das heißt, wenn ich die Bibliothek mit der Option -DCONFIG_A kompiliere, nehme ich an, dass das Programm, das die Bibliothek verwendet, diese Option nicht in der Kompilierungszeit enthalten sollte.
Sind die vorkompilierten Header die Lösung für dieses Problem oder gibt es eine andere Alternative (Vermeidung eines Headers config.h in allen Dateien, die Precompiler-Anweisungen definieren)?
Vielen Dank für die Anleitung.
Klingt wie ein XY-Problem: Frage, wie man eine falsche Lösung für ein Problem beheben kann. Und wähle die Sprache: C oder C++? – Olaf
Für C++ gibt es [die One Definition Rule (alias ODR)] (https://en.wikipedia.org/wiki/One_Definition_Rule). Wenn 'CONFIG_A' beim Kompilieren einiger [Übersetzungseinheiten] (https://en.wikipedia.org/wiki/Translation_unit_ (Programmierung)) definiert ist, aber nicht für andere, haben Sie * undefiniertes Verhalten *. –
Wenn Sie die Bibliothek installieren, können Sie auch eine 'mylibrary.pc' Datei mit den richtigen Präprozessoroptionen installieren. Dann weisen Sie Ihre Benutzer an, 'pkg-config --cflags mylibrary' zu verwenden. – rodrigo