Konstanten definieren
-
In C++ besser mit const. Wegen der Mehrfachdefinition würde ich aber sowas vorschlagen:
//myMath.h: namespace MathConsts { extern const double E; extern const double PI; } //myMath.cpp: #include "myMath.h" namespace MathConsts { const double E =2.718; const double PI=3.142; }
-
und das darf ich dann in jeder cpp-date neu machen oder wie stellst du dir das vor?
-
sorry stand wohl grad aufm schlauch...
thx
-
Nein, das machst du in genau EINER CPP-Datei (am besten die, die auch die Funktionen deiner Bibliothek definiert). Alle anderen Dateien binden lediglich den Header ein - und der Linker findet die richtige Konstante.
-
Gast1 schrieb:
hallo,
wie definiert man konstanten am besten?
#define MATH_CONST_E 2.718281828459045235360287471352662 // e #define MATH_CONST_PI 3.1415926535897932384626433832795 // pinamespace MyMathConsts { static const T E = 2.718281828459045235360287471352662; static const T Pi = 3.1415926535897932384626433832795; } // namespacebei der zweiten variante meckert der compiler dann allerdings (sind im header deklariert), dass "initialisierte daten im header nicht erzeugt werden können". wie kann man das durch ne andere deklaration unterbinden?
danke
selbstverständlich dürfen konstanten in headern definiert werden, und kein compiler wird dir eine derartige fehlermeldung um die ohren hauen (poste doch mal die exakte fehlermeldung) - schonmal weil es den begriff header in der sprachdefinition gar nicht gibt (der taucht erst bei der standardbibliothek auf).
anzumerken wäre, dass das static überflüssig ist, denn const impliziert internal linkage (es sei denn es gab vorher eine extern deklaration). nun bedeutet das allerdings, dass jede ÜE ihre eigene kopie der konstanten erzeugt, wenn eine solche out-of-line kopie in dieser ÜE benötigt wird. bei zahlenkonstanten ist das i.d.R. aber nicht der fall - und konstanten hier bereits im header zu definieren ist definitv die bessere lösung, da so viele (sub-)ausdrücke konstant werden und bereits beim kompilieren ausgewertet werden können. komplizierter wird es, sobald die zu definierende konstant kein pod ist, oder nicht durch einen konstanten ausdruck initilisiert werden soll, das ist hier aber nicht der fall.
-
@camper
Gibt Compiler, die Konstantendefinitionen innerhalb von Header-Dateien in manchen Kombinationen nicht mögen. Der VC-Compiler z.B. mag Kontantendefinitionen innerhalb von Klassendeklarationen nicht. Jedenfalls in der 6er Version und in der 2003er glaub ich auch. Kann deshalb sein, dass er diese auch in namespaces nicht mag.

-
konstanten in klassen sind eine völlig andere geschichte, davon war hier überhaupt nicht die rede. member einer klasse (ob static oder nicht) haben stets external linkage - demzufolge würde eine definion der konstanten in headern leicht zur verletzung der ODR führen. ausnahmsweise darf man nur integrale statische konstanen in der klassendefinition direkt (nur mit konstanten ausdrücken? bin mir da jetzt nicht sicher - aber nur in diesem fall wird man es wollen) definieren.
-
habe mir jetzt noch mal die compiler-optionen angeschaut und bemerkt, dass ich "vorkompilierte header verwenden" (borland c++ builder) aktiviert hatte, wodurch dieser fehler (eigentlich ne warnung) generiert wird. wenn ich keine vorkompilierten header verwende (compilezeit wird dadurch laenger) dann wird auch keine warnung mehr ausgegeben, wenn ich die konstanten im header deklariere.
vielen dank fuer eure hilfe!
-
Man sagte früher, dass die zweite besser wär, den die Compiler Präprozessor Direktiven sind eigendlich kein C++. Man bekommt aber heute keine Probleme mehr mit ihnen.
-
Tc++H schrieb:
Man sagte früher, dass die zweite besser wär, den die Compiler Präprozessor Direktiven sind eigendlich kein C++.
unsinn.
Man bekommt aber heute keine Probleme mehr mit ihnen.
na sowas. was früher ein problem war, ist also heute keins mehr?