[C++] definierte strings in *.h abrufen?

byte_head

Captain
Registriert
Jan. 2005
Beiträge
3.674
Hi,

ich bin soweit das ich gemerkt habe das man Konstanten ja in einer xy.h Datei definieren kann und dann mit #include "xy.h"; einbinden kann.
Meine Frage ist nun, geht das auch mit Strings?

Als Beispiel:

in mydata.h sollen strings liegen wie z.B.

string vorname = Johannes;

etc.

in mydata.cpp dann:

cout << "- " << vorname << endl;

Ist das möglich? Bei mir funktionierts leider nicht, geht das also nur für Konstanten?

Danke, byte :)
 
100% weiss ichs auch nicht mehr, ist schon lange her mit dem proggen.... aber ich glaube man schreibt dann einfach
extern davor, damit ist die variable bekannt muss dann aber in einem cpp file irgendwo vorhanden sein.
 
einfach nur strings müsstest du schon in eine klasse packen.
besser gehts mit #define vorname "johannes".
 
Ist es sinnvoll sich eine xy.h datei anzulegen mit allen wichtigen Werten wie z.B. die Zahl PI etc.? Bei define wird ja noch kein Datentyp angegeben was für vor/nachteile habe ich dadurch? Kann das zu Problemen führen?
 
WingX schrieb:
einfach nur strings müsstest du schon in eine klasse packen.
besser gehts mit #define vorname "johannes".

solche wertzuweisungen haben in headerdateien nichts zu suchen!

Ist es sinnvoll sich eine xy.h datei anzulegen mit allen wichtigen Werten wie z.B. die Zahl PI etc.? Bei define wird ja noch kein Datentyp angegeben was für vor/nachteile habe ich dadurch? Kann das zu Problemen führen?

#defines sind reine textersetzungen d.h. wenn du in einer datei 50 defines hast und später in deinem source aber nur 2 verwendest wirft dir dein präprozessor die übrigen 48 raus. Wenn du allerdings jedesmal eine Variable definierst belegt dir diese dann auch Speicher. als beispiel:
#define WERT 3.5
a += WERT;

wird dann nach dem durchlauf des präprozessors so aussehen:

a += 3.5;

Der Datentyp wird dabei automatisch vom Compiler bestimmt, hier in diesem Fall wäre WERT ein float
Du kannst auch den Wert logischerweise zur laufzeit nicht verändern
 
Zuletzt bearbeitet von einem Moderator:
@wayne_757: du hast zwar gut erklärt, wie #defines funktionieren, aber keine lösung zum problem gegeben. warum gehören solche #defines nicht in headerdateien? wie kann man es besser machen?
 
byte_head schrieb:
string vorname = Johannes;

make it so:

xy.h
Code:
#ifndef XY_H
#define XY_H

#include <string>

const std::string vorname = "Johannes";

#endif


Warum das ganze? Abgesehen von evtl. Fehlern durch den fehlenden String-Header bekommt eine normale Variable external Linkage. D.h. wird dieser Header in mehr als einer Übersetzungseinheit (entspricht cpp-File) benutzt hat jede ihre eigene Variable und beim Linken gibt's multiple defined symbols. (one definition rule verletzt)

Eine Konstante dagegen hat erstmal immer internal linkage und daher stellt das kein Problem dar.


Konstanten mit defines zu machen ist absolut schlechter Stil und gehört in kein C++ Programm.

Warum? Defines sind blanke Textersetzungen. Sie haben weder Typ noch halten sich an Scopes. Ihre Bedeutung bekommen sie erst dort wo sie eingesetzt werden. Wenn dabei ein Syntax-Fehler entsteht hat man kaum eine Chance zu erkennen was der Fehler war und darf sich durch kryptische Compilerfehlermeldungen schlagen (der Compiler kann auch keine besseren geben, weil's der Präprozessor bereits versaut hat). Eventuell entsteht auch mal kein Syntaxfehler und man wundert sich nur noch, warum das Programm nicht navollziehbaren Mist anstellt obwohl alles kompiliert. Eine Konstante dagegen ist eine semantische Einheit, die überall die gleiche Bedeutung hat und auch erst vom Compiler - nicht schon vom Präprozessor - ausgewertet wird. Damit kann bei Fehlern auch sinnvoll gewarnt werden.

Genau dafür gibt's Konstanten und Typdefs.

Zu der Sache mit dem Speicherverbrauch. Das ist nichts worum man sich Gedanken machen sollte! Ein halbwegs moderner Linker entfernt ungenutzte Symbole in der Release-Exe. Und auf die paar Bytes kommt es heutzutage wirklich nicht mehr an (es sei denn man hat Spezialfälle wie Embedded Systems, wo's auf jedes Byte ankommt, aber das ist eher exotisch und erstmal recht egal für jemanden der C++ lernt).


@wayne_757: mal ganz kleinlich : das ist ein Double-Literal, kein Float ;) (sonst 3.5f)




Mal ein bitterböses Beispiel für defines:
Code:
#define int_ptr1 int*
typedef int* int_ptr2;

...

int_ptr1 a, b;
int_ptr2 c, d;
Während Variante 1 einen int* und einen int definiert, macht Variante 2 mit typedef zwei int* draus. Zweiteres erwartet man auch, ersteres ist einfach nur Müll und brandgefährlich. Finger weg von defines in C++ um Konstanten und Typen zu definieren.
 
Zuletzt bearbeitet: (Ergänzung)
Deine Ausführungen waren ja sehr professionell, ich hoffe ich habe alles richtig verstanden:

- #define sind schlechter Stil da es keinen Datentyp bestimmt
- durch den fehlenden Datentyp kann es zu Problemen/Fehlern kommen
- auch wenn es geringfügig weniger Speicherplatz benötigt, sollt man es lassen
- neuere Compiler optimieren ohnehin schon auf weniger Speicherbedarf

Vielen Dank für diesen Interessanten Beitrag. :daumen:
 
Zurück
Oben