Projekt mit verschiedenen Versionen von Code



  • Moin!

    Ich habe ein Projekt, wo ich per #if bzw #else verschiede .cpp Dateien einbinde.

    In diesen Dateien habe ich die gleichen Klassennamen aber mit verschiedenen Inhalt der Klassenfunktion.

    Aber der Compiler "teilt mir mit", dass ich die Klasse mehrfach habe.

    Weiß jemand, wo mein Denkfehler ist? (bin grad etwas "blind" ^^)

    Danke


  • Mod

    Vermutlich machst du was falsch. Das konntest du dir sicherlich denken, aber ohne Code können wir dir auch nicht groß weiterhelfen.

    Klingt aber komisch mit dem "cpp-Dateien einbinden". Machst du etwa includes mit Sourcedateien? Das funktioniert sowieso nicht, egal ob mit #if/#else oder ohne.



  • Hier der Code:

    main.cpp

    #include "header.h"
    #include "config.h"
    
    int main(int argc, char **argv) {
    
        try{
    
        } catch(...) {
        }
    
        return 0;
    
    }
    

    header.h

    #ifndef HEADER
    
    #define HEADER
    
    #include "config.h"
    
        #if COMPILE == 1 && COMPILE !=2
            #include <algorithm>
            #include <array>
            #include <bitset>
            #include <cassert>
            #include <ccomplex>
            #include <cctype>
            #include <cerrno>
            #include <cfloat>
            #include <chrono>
            #include <climits>
            #include <clocale>
            #include <cmath>
            #include <complex>
            #include <csetjmp>
            #include <csignal>
            #include <cstdalign>
            #include <cstdarg>
            #include <cstdbool>
            #include <cstddef>
            #include <cstdint>
            #include <cstdio>
            #include <cstdlib>
            #include <cstring>
            #include <fstream>
            #include <functional>
            #include <future>
            #include <ios>
            #include <iosfwd>
            #include <iostream>
            //#include <istream>
            #include <iterator>
            #include <limits>
            #include <list>
            #include <locale>
            #include <map>
            #include <memory>
            #include <mutex>
            #include <new>
            #include <numeric>
            //#include <ostream>
            #include <queue>
            #include <random>
            #include <ratio>
            #include <regex>
            #include <set>
            #include <sstream>
            #include <stack>
            //#include <streambuf>
            #include <string>
            //#include <strstream>
            #include <system_error>
            #include <thread>
            #include <tuple>
            #include <type_traits>
            #include <typeindex>
            #include <typeinfo>
            #include <valarray>
            #include <vector>
        #else
            #if COMPILE == 2 && COMPILE !=1
                #include <iostream>
                #include <fstream>
                #include <vector>
            #else
                #error include header error
            #endif // COMPILE
        #endif // COMPILE
    
        #if COMPILE == 1 && COMPILE !=2
        #else
            #if COMPILE == 2 && COMPILE !=1
            #else
            #endif // COMPILE
    
        #endif // COMPILE
    
    #endif // HEADER
    

    config.h

    #ifndef CONFIG
    
    #define CONFIG
    
    // 1 - 2011; 2 - 1999
    #define COMPILE 2
    
    #define ZERO 0
    
    #ifdef BINARYEIGHTA
        #undef BINARYEIGHTA
        #define BINARYEIGHTA 256
    #else
        #define BINARYEIGHTA 256
    #endif // BINARYEIGHTA
    
    #ifdef BINARYEIGHTB
        #undef BINARYEIGHTB
        #define BINARYEIGHTB -128
    #else
        #define BINARYEIGHTB -128
    #endif // BINARYEIGHTB
    
    #ifdef BINARYEIGHTC
        #undef BINARYEIGHTC
        #define BINARYEIGHTC 127
    #else
        #define BINARYEIGHTC 127
    #endif // BINARYEIGHTC
    
    #endif // CONFIG
    

    bubbleA.cpp

    #include "header.h"
    
    class bubblesort{
    public:
        bubblesort() {}
        ~bubblesort() {}
        void out() {
            std::cout << "cpp11" << std::endl;
        }
    protected:
    
    private:
    
    };
    

    bubblesortB.cpp

    #include "header.h"
    
    class bubblesort{
    public:
        bubblesort() {}
        ~bubblesort() {}
        void out() {
            cout << "cpp99" << endl;
        }
    
    protected:
    
    private:
    
    };
    

    Die Klasse "bubblesort" soll doppelt eingebunden sein?
    Bzw. er meckert, dass er "cout" nicht, da ich c++11 eingestellt habe. Muss der Code denn nicht per meinen Code "weggelassen" bzw "überlesen" werden, da er nicht eingebunden wird?

    Danke


  • Mod

    Fehlermeldung?

    Linkst du am Ende etwa das Resultat der beiden bubblesort-Übersetzungseinheiten in die gleiche Executable?

    Überhaupt kommt mir dein Code total komisch vor. Wie oft hast du schon erlebt, dass eine 1 gleich 2 ist? Wieso prüfst du dann da drauf? Was sollen die ganzen if und else ohne Körper?

    Was meinst du mit cout und C++11? cout war noch nie im globalen Namensbereich, das hat sich auch mit C++11 nicht geändert.



  • SeppJ schrieb:

    Fehlermeldung?

    Linkst du am Ende etwa das Resultat der beiden bubblesort-Übersetzungseinheiten in die gleiche Executable?

    Überhaupt kommt mir dein Code total komisch vor. Wie oft hast du schon erlebt, dass eine 1 gleich 2 ist? Wieso prüfst du dann da drauf? Was sollen die ganzen if und else ohne Körper?

    Was meinst du mit cout und C++11? cout war noch nie im globalen Namensbereich, das hat sich auch mit C++11 nicht geändert.

    Meine IDE gab mir folgende Fehlermeldung:

    \Programm\bubblesortB.cpp|12|error: 'cout' was not declared in this scope|



  • m.sc.m schrieb:

    Meine IDE gab mir folgende Fehlermeldung:

    \Programm\bubblesortB.cpp|12|error: 'cout' was not declared in this scope|

    Na, damit kann man doch was anfangen! cout ist im namespace std, also muss es std::cout heissen.



  • Warum sehen deine cpp-Dateien so aus, als seien sie eigentlich Header?



  • manni66 schrieb:

    Warum sehen deine cpp-Dateien so aus, als seien sie eigentlich Header?

    Weil ich in h Dateien die "bekannt gebe" welche Klassen etc ich habe. in cpp Dateien habe ich die "Funktionalität" geschrieben.

    Vllt hast du einige grundsätze bzw. einige hilfreiche Tipps für guten, strukturierten und sauberen Code.

    Danke im voraus.



  • Oh je... wer hat dir das denn so beigebracht?

    Frei nach dem Motto:
    Erst ein Mal alle Header Dateien inkludieren, die man so findet. Vielleicht will ich ja irgendwann eine Funktion schreiben, die einen bestimmten Header braucht, also inkludiere ich jetzt schon mal alle, dann bin ich vorbereitet? Dazu fällt mir nix mehr ein 😮

    Und

    #if COMPILE == 2 && COMPILE !=1
    #if COMPILE == 1 && COMPILE !=2
    #if COMPILE == 2 && COMPILE !=1
    

    ist schon putzig. Ein Beitrag für DailyWTF?

    1. Inkludiere nur die Header, die du tatsächlich brauchst. Wenn du wüsstest, was du tust, würdet du nicht iosfwd und ios zusammen inkludieren.

    2. Dein Compiler meckert, weil du sowohl in der .h als auch in der .cpp Datei die Klassendeklaration für bubblesort hast. Woher soll der Compiler wissen, dass du damit die gleiche Klasse meinst? Daher meckert er, weil er nach der .h Datei eine weitere Deklaration in der .cpp Datei findet.
      Das Vorhaben der Trennung der Deklaration und Implementation ist löblich, sieht aber völlig anders aus:

    bubblesort.h

    #ifndef bubblesortH
    #define bubblesortH
    
    class bubblesort
    {
    public:
       bubblesort();
    
       void out();
    };
    #endif
    

    bubblesort.cpp

    #include "bubblesort.h"
    
    // wird für std::cout gebraucht, also erst hier inkludieren
    #include <iostream>
    
    bubblesort::bubblesort()
    {
    }
    
    void bubblesort::out()
    {
       std::cout << "cpp wasauchimmer" << std::endl;
    }
    
    1. #define für magic numbers sind böse! C++ hat das bessere Möglichkeiten (static const /constexpr unsigned int, enum).

    2. Bubblesort als Klasse? Warum?



  • m.sc.m schrieb:

    Weil ich in h Dateien die "bekannt gebe" welche Klassen etc ich habe. in cpp Dateien habe ich die "Funktionalität" geschrieben.

    Nicht im gezeigten Code.


Anmelden zum Antworten