#if defined - Anweisung wird nicht ausgeführt ?



  • Hallo c-community,

    ich habe ein Problem. Ich möchte nur unter bestimmten Umständen eine .h Datei in mein Projekt aufnehmen. Ich habe gefunden, dass dies über eine #if defined - Anweisung normal getätigt wird. Hier ein Beispiel, wie ich es implementiert habe. In einer meiner Headerdateien, die ich immer benötige steht:

    #if defined (FOO)
        #include    "foo.h"
    #endif  // #if defined (FOO)
    

    In meiner main.h definiere ich dann mein FOO:

    #define FOO
    // hier nach kommt der Include aller meiner Headerdateien
    

    Aber ich erhalte mit dieser Vorgehensweise immer Fehlermeldungen bezüglich aller Methoden, welche in foo.h und foo.c definiert sind:

    implicit declaration of function ‘...‘

    Lasse ich die #if define (FOO)..-Anweisungen weg compiliert der Computer das Programm ohne Probleme ABER ich muss die für das Projekt eine eher unwichtige Datei mit beilegen.
    Ja ich weiß, ich könnte das einfach streichen, aber ich baue mir gerade ein kleines Framework auf, bei dem ich nicht ständig alles per Copy&Paste oder Delete anpassen will.
    Ich möchte quasi in der main.h sagen ich brauche Datei foo1.h per #define FOO1, foo4.h per #define FOO4, ... und alle unnötigen Dateien bleiben weg.

    Hier vieleicht noch meine Compilerspezifikationen:

    -Wall -Wextra -Werror -pedantic -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline -Wno-long-long -Wuninitialized -Wconversion -Wstrict-prototypes -ggdb -std=c99
    

    Das Problem scheint also wie folgt, mit der #if defined - Anweisung scheint er das #include nicht auszuführen und die darin definierten Methoden und Funktionen liegen zum Compilieren nicht vor und es kommt zur Entsprechenden Fehlermeldung ABER WARUM???

    Vielen Dank
    mirrowwinger



  • Du hast FOO wohl an der falschen Stelle definiert.

    Sinnvoll wäre es beim Compileraufruf mit der Option -D

    Also fehlt in deinen Compilerspezifikationen ein -DFOO



  • mirrowwinger schrieb:

    Das Problem scheint also wie folgt, mit der #if defined - Anweisung scheint er das #include nicht auszuführen und die darin definierten Methoden und Funktionen liegen zum Compilieren nicht vor und es kommt zur Entsprechenden Fehlermeldung ABER WARUM???

    Wahrscheinlich kompilierst du die foo.c Datei auch ohne der inkludierten .h Datei mit. 😉



  • @DirkB du hast vollkommen Recht. Mit der Erweiterung

    -DFOO

    und dem löschen der #define FOO in main.h compiliert das Programm jetzt vollständig mit und ohne der .h sowie .c Datei. Vielen Dank

    @SingenderHolzkübel nein wie ich schon geschrieben habe ohne die #if defined (FOO) - Anweisung compiliert er das Programm vollständig ohne Error und Warnings. Was das vergessen der includierten .h-Datei ausschließt. Trotzdem vielen Dank. DirkB hat die Lösung meines Problems gefunden.

    Die einzige Frage die ich jetzt habe, ist warum macht die Bekanntgabe von FOO über #define Probleme und die über -DFOO im Compileraufruf nicht?

    Vielen Dank
    mirrowwinger



  • mirrowwinger schrieb:

    Die einzige Frage die ich jetzt habe, ist warum macht die Bekanntgabe von FOO über #define Probleme und die über -DFOO im Compileraufruf nicht?

    Jede .c Datei wird als eigenständige Einheit compiliert.
    Zuerst läuft der Preprozessor durch und macht alle seine Ersetzungen und Includes.
    Dann kommt der Compiler.
    Wenn im Compilerlauf für die jeweilige .c nirgends dein main.h eingebunden wird, ist FOO nicht definiert.

    mirrowwinger schrieb:

    ... ohne die #if defined (FOO) - Anweisung compiliert er das Programm vollständig ohne Error und Warnings. Was das vergessen der includierten .h-Datei ausschließt.

    Mit dem #if defined wird das #include nur gemacht, wenn zu dem Zeitpunkt FOO auch definiert ist.
    Und das ist es demnach nicht.
    Deine main.h ist nicht oder zu spät eingebunden.

    Es kommt darauf an, wo du das #define hast.

    Bei -D gilt es von Anfang an.



  • wobei ich mich frage, was für ein use case dafür existiert, bei dem es besser wäre, den Umfang der einzulesenden Dateien mit einer Compiler-Option festzulegen, statt gleich zu schreiben:

    Foo.h:
    
    #ifdef FOO
    ... Inhalt von Foo.h einschließlich include guards ...
    #endif
    

    und Foo.h immer zu inkludieren.


Anmelden zum Antworten