wie kann ich einzelne .cpp und .h zum fertigen Programm zusammenfrickeln?



  • Hallo Forum,

    ich habe hier eine Aufgabe, in der es darum geht, dass 2 getrennte Programme eine selbst erstellte Bibliothek nutzen sollen. Es geht ums visual Studio

    Zur Entwicklung habe ich zunächst alles in der Hauptdatei (PerIn.cpp) belassen.

    Die ist so aufgebaut:

    -#include's
    -prototypen
    -prototypen definieren (unterprogramme)
    -main()

    Es gibt noch eine perDef.h mit Variablendefinitionen.

    nun sollen die Unterprogramme in eine .h/.cpp-Bibliothek. Drum habe ich folgendes gemacht:

    -die Prototypen in die Datei namens "PerIO.h" gepackt
    -die Unterprogramme in eine Datei namens "PerIO.cpp" gepackt. Dort noch die von den Unterprogrammen gebrauchten includes und stdafx.h eingebunden.
    -main() und die includes in der Hauptdatei zurückgelassen.
    -in der Hauptdatei, da habe ich die PerIO.h eingebunden. Diese hab ich mit #ifndef vor doppelt einbinden geschützt.

    dann bekomme ich das hier zu lesen:

    PerIO.obj : error LNK2005: "void __cdecl clreol(int)" (?clreol@@YAXH@Z) ist bereits in in.obj definiert.
    1>PerIO.obj : error LNK2005: "void __cdecl clreol(int)" (?clreol@@$$FYAXH@Z) ist bereits in in.obj definiert.
    1>C:\pa1\in\Debug\in.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.

    perdef.h (war fertig bei der Aufgabe mit dabei):

    #ifndef PerDef_Is_Included                      // Steuerung bedingtes include
      #define PerDef_Is_Included
    
      ..... variablendefinitionen und konstanten ....
    
    #endif
    

    perIO.h

    #include "vsconio.h"    
    #include "stdafx.h"
    #include "perdef.h"
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #ifndef PERIO_H                                /* Doppelinclude verhindern */
    #define PERIO_H
    
    ...prototypen....
    
    #endif
    

    perio.cpp

    #include "stdafx.h"
    #include "perDef.h"     
    #include "vsconio.h"    
    //#include "perio.h"
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #ifndef perio_c
    #define perio_c
    
    .....unterprogramme....
    
    #endif
    

    perin.cpp

    #include "stdafx.h"
    #include "perDef.h"     
    #include "vsconio.h"    
    #include "perio.h"
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(void) { 
      ... 
    }
    

    vsconio.h (war auch bei der Aufgabe mit dabei)

    using namespace System;     // Zugriff auf den Namensbereich "System" -> Console
    
    #include <stdio.h>          // C Standard-IO
    
    #ifndef _VS_conio_h_
    #define _VS_conio_h_
    
      #define clrscr()      Console::Clear()
      #define gotoxy(x,y)   Console::SetCursorPosition((x-1),(y-1))
      #define wherex()      (Console::CursorLeft+1)
      #define wherey()      (Console::CursorTop+1)
    
      void clreol(int xe = 79) {  // aktuelle Zeile: Spalten xakt bis xe(79) löschen
        int xr, xa = wherex();
        for( xr = xa; xr <= xe; xr++ ) printf(" "); 
        gotoxy(xa, wherey());
      } // clreol()
    
    #endif
    // end of file vsconio.h
    

    Was mache ich falsch 😞 ?



  • Warum gibst du deinem C-Quelltext die Endung .cpp?

    MfG f.-th.



  • Weil es so vorgegeben wird 😉



  • Franky666 schrieb:

    Weil es so vorgegeben wird 😉

    das ist aber käse!



  • ist das nicht egal? Entscheidend ist das, was da drinne is.



  • Franky666 schrieb:

    ist das nicht egal? Entscheidend ist das, was da drinne is.

    nein. Weil viele IDEs Dateien mit Endung .cpp automatsich als C++ betrachten und durch den C++ Compiler jagen. C != C++

    außerdem

    using namespace System;     // Zugriff auf den Namensbereich "System" -> Console
    ....
     #define clrscr()      Console::Clear()
      #define gotoxy(x,y)   Console::SetCursorPosition((x-1),(y-1))
      #define wherex()      (Console::CursorLeft+1)
      #define wherey()      (Console::CursorTop+1)
    

    ist definitiv kein C sondern C++

    igit, wer schreibt denn so eine schreckliche Mischung aus Äpfel und Kartofeln? Wo hast du das her?



  • Das ist auch kein C++, sondern C++/CLI.

    Wie dem auch sei, der Fehler liegt in der vsconio.h - clreol wird darin nicht nur deklariert, sondern auch definiert, so dass der Header nur in einer Übersetzungseinheit eingebunden werden kann. Wer hat das Ding eigentlich geschrieben? Ist ja fürchterlich.

    Die einfachste Lösung (wenn das in C++/CLI von C++ her nicht verändert wurde) wird sein, den Header wie folgt umzuschreiben:

    using namespace System;
    
    #include <stdio.h>
    
    #ifndef _VS_conio_h_
    #define _VS_conio_h_
    
      #define clrscr()      Console::Clear()
      #define gotoxy(x,y)   Console::SetCursorPosition((x-1),(y-1))
      #define wherex()      (Console::CursorLeft+1)
      #define wherey()      (Console::CursorTop+1)
    
      inline /* <-- HIER */ void clreol(int xe = 79) {
        int xr, xa = wherex();
        for( xr = xa; xr <= xe; xr++ ) printf(" ");
        gotoxy(xa, wherey());
      }
    
    #endif
    

    Mittelfristig würde ich mich aber an deiner Stelle nach einer sinnvolleren Quelle von Übungsaufgaben umsehen.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum C++ verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • Eigentlich hab ich die vsconio.h der Vollständigkeit halber hier gepostet, damit keiner fragt "was ist das für ein include?". Gut das ich das gemacht hab.

    Die inlude-Datei ist wahrlich von unserem Professor (irgendwie von Pascal nach C portiert, weils in C das nicht gibt) und ich hab sie unverändert reingesetzt. Ich hab sie mir eigentlich gar nicht so genau angeguckt, weil ich eh nur clrscr() davon brauche. Aber da suche ich mir lieber ner Alternative und nehme das Incluce raus 🙄 .....

    Bin auch nicht auf die Idee gekommen, dort nach dem Fehler zu suchen. Aber jetzt sehen ich das selber...

    Danke. 🙂

    Man kann doch sicher irgendwie ganz einfach ohne diese vsconio.h die Konsole löschen, oder?

    Scheinbar bekommen wir c und c++ wirklich gemischt beigepult. dann ist es ja vielleicht besser, die cpp-dateien so zu lassen. 😞



  • Mies!

    system("cls");
    

    Funktioniert nur auf Windows und ich weiß nicht was dein Prof. dazu sagt. Ich denke, die STL bietet da eine bessere Lösung.

    Gruß



  • theliquidwave schrieb:

    Funktioniert nur auf Windows und ich weiß nicht was dein Prof. dazu sagt. Ich denke, die STL bietet da eine bessere Lösung.

    Nicht dass ich wüßte. Aber das gehört in eine Funktion ausgelagert, die entsprechend cls oder clear benutzt.



  • theliquidwave schrieb:

    Ich denke, die STL bietet da eine bessere Lösung.

    Mit Sicherheit nicht. Erstens, die STL (= Container, Iteratoren, Algorithmen) sowieso nicht. Zweitens, die Standardbibliothek ansonsten auch nicht.


Anmelden zum Antworten