extern fuer globale variabeln



  • hi,
    anscheinend weiss ich nicht genau wie man extern einsetzt 🙄 , also hoffe ich mal einer von euch kann mir helfen. also ich habe ein globales objekt fuer eine log datei, und jedes modul muss natuerlich darauf zurueckgreifen koennen, um das programmgeschehen zu dokumentieren. ungefaehr so:

    // logfile.hpp
    class LogFile  { /* ... */ };
    
    // logfile.cpp
    LogFile* logfile = LogFile::init (); // das ist das globale objekt
    

    so weit so gut. jetzt habe ich eine header ( globals.hpp ) in der ich alle meine globalen variabeln mit extern deklariere, damit ich dann nur die globals.hpp inkludieren brauche, wenn ich zugriff auf globale variabeln benoetige:

    // globals.hpp
    #ifndef GLOBALS_HPP
    #define GLOBALS_HPP
    
    extern LogFile* logfile;
    
    #endif
    

    mein compiler ( vc 7.1 ) gibt aber zahlreiche fehlermeldungen aus und ich weiss einfach nicht was er mir zu sagen versucht. unter anderem:

    ...\Globals.hpp(5) : error C2143: syntax error : missing ';' before '*'
    ...\Globals.hpp(5) : error C2501: 'logfile' : missing storage-class or type specifiers
    ...\LogFile.cpp(5) : error C2143: syntax error : missing ';' before '*'
    ...\LogFile.cpp(5) : error C2501: 'LogFile' : missing storage-class or type specifiers
    ...\LogFile.cpp(5) : error C2501: 'logfile' : missing storage-class or type specifiers
    ...\LogFile.cpp(5) : error C2086: 'int *logfile' : redefinition
    ...\Globals.hpp(5) : see declaration of 'logfile'
    ...\LogFile.cpp(5) : error C2440: 'initializing' : cannot convert from 'LogFile *' to 'int *'
            Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    ...\Globals.hpp(5) : error C2143: syntax error : missing ';' before '*'
    ...\Globals.hpp(5) : error C2501: 'logfile' : missing storage-class or type specifiers
    

    was auch immer



  • "class LogFile;" über die extern-Zeile und auf einmal liegen sich dein Quelltext und der Compiler glücklich in den Armen.



  • ich dachte immer bei extern wird der variablentyp ignoriert. naja so kann man sich irren. jetzt kommen zumindest andere fehler:

    in jeder datei in der ich logfile benutze : error C2027: use of undefined type 'LogFile'
    ...\Globals.hpp(4) : see declaration of 'LogFile'
    

    was auch immer



  • Wo du mit der LogFile noch irgendwas machen willst, musst du natürlich auch LogFile.hpp (oder wie auch immer) einbinden.



  • sorry aber da muss ich dich enttaeuschen. selbst wenn ich logfile.hpp inkludiere kommen die selben fehlermeldungen. hat vielleicht sonst noch wer eine idee?

    was auch immer



  • das hab ich noch vergessen. ich habs auch mit dem mingw probiert und der kommt schon vor dem kompilieren mit "multiple target patterns" und zeigt auf diese stelle in der makefile.win datei:

    clean: clean-custom
    	rm -f $(OBJ) $(BIN)
    
    $(BIN): $(OBJ)  // hier ist der fehler
    	$(CPP) $(LINKOBJ) -o "Project5.exe" $(LIBS)
    

    vielleicht koennt ihr damit was anfangen. schon mal danke im voraus.

    was auch immer



  • naja, vielleicht ist der fehler ja auch im code, also poste ich ihn mal, da er sowieso sehr trivial ist.

    // logfile.hpp
    #ifndef LOGFILE_HPP
    #define LOGFILE_HPP
    #include <ctime>
    #include <fstream>
    #include "Exception.hpp"
    
    class LogFile  {
    
    private:
      std::ofstream logfile;
      static bool initialized;
    
      LogFile ()  {
    		remove ( "log.txt" );
    
    		logfile.open ( "log.txt" );
    
    		if ( !logfile.is_open () )
    			throw Exception ( "Couldn`t open file: log.txt", __FILE__, __LINE__ );
      };
    
      LogFile ( const LogFile& );
      LogFile& operator= ( const LogFile& );
    
    public:
      static LogFile* init ()  {
        static LogFile* logFile;
    
        if ( !initialized )  {
          logFile = new LogFile;
          initialized = true;
        }
    
        return logFile;
      };
      static bool is_initialized ()  {
        return initialized;
      };
      static void release ( LogFile* logFile )  {
        if ( initialized )  {
          delete logFile;
          initialized = false;
        };
      };
      void log ( const char* logstream )  {
    		std::time_t time = std::time ( 0 );
    
    		logfile << ctime ( &time ) << logstream << '\n';
      };
    
      ~LogFile ()  {
        logfile.close ();
      };
    };
    
    #endif
    
    // logfile.cpp
    #include "LogFile.hpp"
    
    bool LogFile::initialized = false;
    
    LogFile* logfile = LogFile::init ();
    

    was auch immer



  • argh. fuenf minuten nach dem post finde ich heraus woran es liegt 🙄
    naja wie ihr sehen koennt inkludiert logfile "exception" um ne exception zu werfen wenn die log datei nicht geoeffnet werden kann. exception wiederrum inkludiert logfile, um jede exception zu archivieren. obwohl ich bei beiden headern include guards vrewende, scheint das nicht ganz zu funktionieren, d.h. wenn ich z.b. aus der logfile.hpp das "#include "Exception.hpp" entferne funktioniert es einwandfrei. aber wie kann ich dieses problem umgehen, wenn zwei header sich gegenseitig benoetigen?

    was auch immer



  • Ziehmlich schön ist es, wenn man dafür clog benutzt und diese beim starten auf eine Datei umlenkt und wärend des Programms nur noch die sachen in clog hineinschiebt! Kann man das machen? Dann hätte man keine Schärereien und alles passt.


Anmelden zum Antworten