richtiger Aufbau

Dieses Thema im Forum "C/C++" wurde erstellt von Nano, 13.02.2009.

  1. Nano

    Nano Foren As

    Dabei seit:
    02.12.2006
    Beiträge:
    93
    Zustimmungen:
    0
    Hallo zusammen ich habe eine wohl recht einfach frage zur richtigen Struktur eines C++ Programmes.

    Soweit ich mich informiert habe werden

    1.)Methoden im Header deklariert und in der cpp implementiert
    2.) Die h Datei in die cpp included

    Nun zu meinen Fragen :

    Wenn ich nun aus einem anderen Programm funktionen dieser cpp datei aufrufen möchte muss ich die .cpp includen und den header aussen vor lassen ?

    Wie sieht es mit Struct und Namespace aus, werden diese im Header deklariert ?
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Nein, eine .cpp Datei solltest Du nicht mit #include einschliessen.

    Wenn Du ein Programm mit g++ (oder einem anderen Compiler) kompilierst, macht der Kompiler eigentlich (min.) zwei Schritte auf einmal fuer Dich:
    1) er setzt das, was Du programmiert hast, in Maschinencode um. Das Ergebnis ist eine Objektdatei, meist mit der Endung ".o". Du erhaeltst sie, indem Du statt g++ 'g++ -c' schreibst. In dieser Objektdatei ist tatsaechlich nur das drin, was auch in der .cpp-Datei drinsteht, d.h., Funktionen, die Du aus anderen .cpp-Dateien oder gar Bibliotheken verwendest, sind dort nicht mit drin.

    2) er ruft den Linker auf (unter UNIX/Linux oft das Programm ld). Dieser verknuepft alle Funktionen so, dass ein lauffaehiges Programm entsteht.

    Wenn Du nun eine Funktion aus einer anderen .cpp Datei verwenden moechtest, dann musst Du diese .cpp-Datei beim Kompilieren mit angeben.

    Wenn Du zum Quellcode keinen Zugang hast, benoetigst Du eine Bibliothek (endet unter Linux auf .so, z.B. /usr/lib/libm.so, benoetigt man, um ein "dynamisch verlinktes" Programm zu erzeugen - d.h., zum Ausfuehren benoetigt man nicht nur das Programm, sondern auch diese Bibliothek ) oder ein Archiv (endet unter Linux auf auf .a, z.B. /usr/lib/libm.a, benoetigt man, um ein "statisch verlinktes" Programm zu erzeugen: zum Ausfuehren benoetigt man libm.a dann nicht mehr, weil alles ins Programm gesteckt wurde).

    Falls Du den letzten Fall meinst und eine Bibliothek miteinbeziehen moechtest, schreibe das doch kurz, weil es dann eine laengere Hilfestellung gibt.

    Ich hoffe, ich habe mehr geholfen als verwirrt!!!
     
  4. #3 Scorcher24, 17.02.2009
    Scorcher24

    Scorcher24 AMDGuru

    Dabei seit:
    27.07.2004
    Beiträge:
    77
    Zustimmungen:
    0
    Ort:
    Nürnberg, Germany
    Generell sollte man bei Headerdateien schonmal sog. Include-Guards verwenden:
    Code:
    #ifndef __NAMEDERDATEI_H_INCLUDED__
    #define __NAMEDERDATEI_H_INCLUDED__
    
    CODE
    
    #endif /* __NAMEDERDATEI_H_INCLUDED__ */
    
    edit: Damit es hier keine Kollisionen mit anderen Dateien gibt, kann man, wenn die Datei soweit fertig ist bzw in einem fortgeschrittenen stadium, auch einen MD5-Hash nehmen. Aber das macht man nur bei Dateien, die es oft gibt, wie setup.h oder so.

    Das sorgt dafür, dass du die Datei auch mehrfach einbinden kannst, ohne Linkerfehler. Funktionen, die direkt im Header komplett eingetragen werden, können optimalerweise als "inline" deklariert werden, damit Linkerfehler vermieden werden. Das macht man aber nur für einzeiler.
    Diese Headerdatei kannst du dann in jede .cpp einbinden. Und wie schon geschrieben, niemals die .cpp einbinden. Es gibt einzelne Ausnahmen, aber da kommst du selbst drauf irgendwann :).

    Structs, die in cpp übrigens auch nur Klassen sind, nur by default public statt private, werden im Header deklariert, ausser man möchte sie verstecken oder der User des Headers braucht keinen Zugriff darauf, dann kann man sich auch in der .cpp verstecken:
    Code:
    struct SFoo
    {
     int a;
    };
    // ist das gleiche wie 
    class CFoo
    {
    public: 
       int a;
    };
    
    Namespaces braucht man im Header UND in der Source-Datei, wenn man Sie definiert:
    Code:
    // .h 
    namespace  MyNamespace
    {
       class Foo
      {
         Foo();
      };
    }
    // .cpp: 
    Foo::Foo() {}  //Würde einen Fehler geben
    // entweder:
    MyNamespace::Foo::Foo() {}
    // oder 
    namespace MyNamespace 
    {
      Foo::Foo() {}
    }
    
    HTH
    rya.
     
  5. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Mit (doppelteln) fuehrenden Unterstrichen waere ich vorsichtig. Ist zwar "nur" ein Makroname - doch eigentlich sind doppelte Unterstriche fuer Compiler-Interna reserviert, und man ziemlich kranke und kaum vorhersehbare Effekte erreichen, wenn man damit rumspielt (vor einiger Zeit hatte ich mal einen Beispielcode gesehen - leider nun nicht mehr - bei dem eine Ausgabe produziert wurde, bevor das Programm 'main' ueberhaupt erreichte...)
     
  6. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

richtiger Aufbau

Die Seite wird geladen...

richtiger Aufbau - Ähnliche Themen

  1. Geforce 6600 - Richtiger Treiber aber keine 3d-Beschleunigung

    Geforce 6600 - Richtiger Treiber aber keine 3d-Beschleunigung: Hejho - hab neulich auf Ubuntu 8.10 upgegraded. Seitdem scheine ich einen neuen Grafiktreiber zu haben - der funktioniert auch meistens...
  2. Kein "richtiger" Bass ?!?

    Kein "richtiger" Bass ?!?: Ich hatte mich gewundert, warum kein Bass aus meinen Lautsprechern kam und hatte deswegen schon mal gegoogelt. Schließlich fand ich heraus, dass...
  3. MySQL Verbindungsfehler trotz richtiger Logindaten

    MySQL Verbindungsfehler trotz richtiger Logindaten: Hi... Ich habe folgendes Problem. Momentan habe ich einen Server laufen (SuSE 10.1) mit dem Apache 2.2.3, PHP 5.1.1 und MySQL 5.0.22 am...
  4. Mit richtiger DSL-Ausstattung auf die Datenautobahn

    Mit richtiger DSL-Ausstattung auf die Datenautobahn: Berlin/Hamburg (dpa/gms) - Der schnelle Internetzugang per Digital Subscriber Line, kurz DSL genannt, setzt eine entsprechende Hardware voraus....
  5. Netzwerkaufbau mit simulierten Paketen unter Linux

    Netzwerkaufbau mit simulierten Paketen unter Linux: Hallo, ich habe folgendes Problem. Da ich noch sehr unerfahren in Sachen Linux bzw. Netzwerkaufbau bin, wollte ich fragen, ob Ihr mir vllt etwas...