multiple definition of `SecondTicker'



  • Hallo ich habe einen Simplen Header

    #ifndef LIBRARIES_ESP_DATUM_H_
    #define LIBRARIES_ESP_DATUM_H_
    
    /* LwIP SNTP example
    
       This example code is in the Public Domain (or CC0 licensed, at your option.)
    
       Unless required by applicable law or agreed to in writing, this
       software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
       CONDITIONS OF ANY KIND, either express or implied.
    */
    
    #include <Arduino.h>
    #include <string.h>
    #include <time.h>
    #include <sys/time.h>
    
    #include "apps/sntp/sntp.h"
    
    #define TimeServer "ntp0.fau.de"
    #define TimeZone "Europe/Berlin"
    
     bool SecondTicker = false;
    
    void GetDateFirst(char strftime_buf[]);
    
    time_t GetSNMPTime_t(void);
    tm GetSNTPDateStruct(void);
    
     void obtain_time();
    
     String GetTimeStr_tm(tm Date);
    
    #endif /* LIBRARIES_ESP_DATUM_H_ */
    

    und der Compiler meckert mir
    multiple definition of `SecondTicker'
    an. Egal wie die Variable benannt ist.
    Verschiebe ich die in einen anderen Header geht das.
    Ich habe schon verschiedene Erklärungen dazu gelesen, aber keine war schlüssig für mich.


  • Mod

    Wenn du etwas in Headern definierst, dann wird es logischerweise überall dort definiert, wo der Header benutzt wird. Da Header normalerweise an vielen verschiedenen Stellen benutzt werden (bei dem anderen Header hattest du bloß Glück, dass das nicht so war), kommen Mehrfachdefinitionen raus, was nicht erlaubt ist.

    Es gäbe zwar prinzipiell Mittel und Wege für dein Vorhaben, aber ich tue dir einen Gefallen und verrate sie dir nicht, denn dein Vorhaben ist, dass du eine globale Zustandsvariable haben möchtest. Das ist aus sehr vielen Gründen ein absolutes Anti-Pattern und die wahre Hilfestellung für dich ist, diesen globalen Zustand möglichst schnell los zu werden und zu lernen, so etwas niemals wieder zu benutzen.



  • Danke für die Antwort.
    Das ist ein simples Projekt mit gerade 4 Headern und den dazugehörigen
    Source Files.
    Wenn Du µC programmierst mußt Du umdenken. Hier benutzt Du globale Vars um Speicher zu sparen. Ich dachte das man Mehrfachnutzung mit
    #ifndef LIBRARIES_ESP_DATUM_H
    ausschließt, für jemanden der aus der Pascal Welt kommt ist C schon sehr merkwürdig, ich bedanke mich für eure Antworten.



  • Dieser Thread wurde von Moderator/in camper aus dem Forum C++ (alle ISO-Standards) in das Forum C (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Lösch die Zeile:

    bool SecondTicker = false;
    

    aus der h-Datei raus und setzt sie in eine C-Datei.

    In anderen C-Dateien schreib:

    extern bool SecondTicker;
    

    Es wird dann die gleiche Variable benutzt.



  • In C wird jedes Sourcefile für sich getrennt compiliert.

    Dann werden die entstandenen Object-Dateien mit den benötigten Bibliotheken vom Linker zu einem ausführbaren Programm gebunden.

    Deine Meldung kommt vom Linker, denn erst der kann das feststellen.

    Der Include-Guard verhindert nur das mehrfache inkludieren der Headerdateien in ein Sourcefile.

    Variablendefinitionen haben in Headerdateien nichts zu suchen. (Deklarationen schon)


Log in to reply