1

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.

+3

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

+5

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 *. –

+0

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

Antwort

0

Sie können den Code für die Strukturdefinition "generieren" und die generierte Definition zusammen mit der entsprechenden Bibliothek versenden. Eine Idee ist, Ihre Strukturen in einem Header ohne #include s zu halten. In diesem Fall können Sie den C-Präprozessor auf ihnen ausführen, um eine Datei ohne #ifdef s zu erhalten (die Sie dann zum Erstellen und Versenden verwenden können).

Eine andere Möglichkeit ist, etwas Besonderes in Ihrem Build-System zu tun. Zum Beispiel CMake hat #cmakedefine, die Sie innerhalb einer C oder C++ - Quelldatei verwenden können und dann Code daraus generieren können.

Verwandte Themen