C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Konstanten im Header

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Steffen Liersch
Guest





PostPosted: Wed Dec 17, 2003 11:51 am    Post subject: Konstanten im Header Reply with quote



Hallo Leute!

Wenn ich im C++Builder Variablen im Header File anlege, darf ich diese im
Header nicht initialisieren, sondern muss diese mit extern deklarieren und
im Modul definieren. Gilt dies nun auch für die folgenden Konstanten?

const AnsiString C_MY_STR="uiewriowqio";
const int C_MY_INT=65;

Je nach Laune des Compilers meldet er "Möglicherweise inkorrekt Zuweisung"
(wird wahrscheinlich nur für Konstanten gemeldet, die tatsächlich auch
benutzt werden).

Vielen Dank und viele Grüße,
Steffen

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Thomas Maeder
Guest





PostPosted: Wed Dec 17, 2003 2:02 pm    Post subject: Re: Konstanten im Header Reply with quote



"Steffen Liersch" <steffen_liersch_pub (AT) gmx (DOT) de> writes:

Quote:
Wenn ich im C++Builder Variablen im Header File anlege, darf ich diese im
Header nicht initialisieren, sondern muss diese mit extern deklarieren und
im Modul definieren.

D.h. Du musst verhindern, dass die gleiche Variable in jeder
Übersetzungseinheit, welche den Header #included, einmal angelegt wird.
Durch die extern-Deklarierung wissen diese Übersetzungseinheiten zwar von
der Existent der Variablen, legen sie aber nicht selbst an. Nur diejenige,
wo die Definition drin steht (das ist die, welche Du "Modul" nennst), legt
die Variable an.


Quote:
Gilt dies nun auch für die folgenden Konstanten?

const AnsiString C_MY_STR="uiewriowqio";

Für C_MY_STR brauchst Du das nicht zu machen, aber Du darfst, und ich finde
es empfehlenswert.

Zunächst unterscheiden sich im namespace-Gültigkeitsbereich definierte
(also z.B. globale) const Objekte mit statischer Lebensdauer von
ebensolchen non-const Objekten dadurch, dass sie "internal linkage" haben.
Wenn sie also in mehreren Übersetzungseinheiten definiert werden, stören diese
verschiedenen Definitionen einander nicht, weile jede dieser
Übersetzungseinheiten nur das "eigene" Objekt sieht.

Trotzdem würde ich C_MY_STR aber im Header als extern const deklarieren und in
nur einer Übersetzungseinheit definieren, weil sonst viele AnsiString-Objekte
mit gleichem Namen und gleichem Wert erzeugt werden, was nichts bringt.


Quote:
const int C_MY_INT=65;

Auch für C_MY_INT brauchst Du es nicht zu tun, und hier würde ich es auch
nicht tun.

Grund: wenn Sie wie oben im Header definiert wird, ist C_MY_INT ist eine
"Übersetzungszeitkonstante"; sie kann also z.B. für die Dimensionierung
eines statischen oder automatischen Arrays verwendet werden.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Karl Heinz Buchegger
Guest





PostPosted: Wed Dec 17, 2003 4:24 pm    Post subject: Re: Konstanten im Header Reply with quote



Thomas Maeder wrote:
Quote:

const int C_MY_INT=65;

Auch für C_MY_INT brauchst Du es nicht zu tun, und hier würde ich es auch
nicht tun.

Grund: wenn Sie wie oben im Header definiert wird, ist C_MY_INT ist eine
"Übersetzungszeitkonstante"; sie kann also z.B. für die Dimensionierung
eines statischen oder automatischen Arrays verwendet werden.


?????
Wolltest Du hier schreiben:
...., und hier würde ich es auch tun.

Also ohne das 'nicht'.

Die Moeglichkeit diese Uebersetzungszeitkonstanten fuer die Dimensionierung
von Arrays zu verwenden ist ja einer der Gruende warum man solche Konstrukte
macht (die dann normalerweise in einem Header gesammelt werden).

--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Thomas Maeder
Guest





PostPosted: Wed Dec 17, 2003 5:10 pm    Post subject: Re: Konstanten im Header Reply with quote

Karl Heinz Buchegger <kbuchegg (AT) gascad (DOT) at> writes:

Quote:
Thomas Maeder wrote:

const int C_MY_INT=65;

Auch für C_MY_INT brauchst Du es nicht zu tun, und hier würde ich es auch
nicht tun.

Grund: wenn Sie wie oben im Header definiert wird, ist C_MY_INT ist eine
"Übersetzungszeitkonstante"; sie kann also z.B. für die Dimensionierung
eines statischen oder automatischen Arrays verwendet werden.


?????
Wolltest Du hier schreiben:
...., und hier würde ich es auch tun.

Nein. Smile Das sind jetzt etwas viele Negationen, deshalb nochmals:

Hier würde ich im Header

const int C_MY_INT=65;

schreiben; oder eher, weil ich das besser lesen kann,

int const cMyInt(65);

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Karl Heinz Buchegger
Guest





PostPosted: Wed Dec 17, 2003 7:13 pm    Post subject: Re: Konstanten im Header Reply with quote

Thomas Maeder wrote:
Quote:

Karl Heinz Buchegger <kbuchegg (AT) gascad (DOT) at> writes:

Thomas Maeder wrote:

const int C_MY_INT=65;

Auch für C_MY_INT brauchst Du es nicht zu tun, und hier würde ich es auch
nicht tun.

Grund: wenn Sie wie oben im Header definiert wird, ist C_MY_INT ist eine
"Übersetzungszeitkonstante"; sie kann also z.B. für die Dimensionierung
eines statischen oder automatischen Arrays verwendet werden.


?????
Wolltest Du hier schreiben:
...., und hier würde ich es auch tun.

Nein. Smile Das sind jetzt etwas viele Negationen, deshalb nochmals:

Hier würde ich im Header

const int C_MY_INT=65;

schreiben; oder eher, weil ich das besser lesen kann,

int const cMyInt(65);

OK.
Dann hab ich Dich missverstanden. Im Original hat es fuer mich so geklungen
als ob Du davon abraten wuerdest und das hab ich nun ganz und gar nicht verstanden.

--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Steffen Liersch
Guest





PostPosted: Thu Dec 18, 2003 7:23 am    Post subject: Re: Konstanten im Header Reply with quote

Hallo Thomas,

folgende Konstruktion funktioniert:

im Header:
extern const AnsiString g_sTest;

in Übersetzungseinheit:
const AnsiString g_sTest="Test String";


Damit man nun im Header sieht, mit welchem Wert die Konstante initialisiert
wird, habe ich mir folgendes Makro überlegt:


Header:

#ifdef __MAIN_MODULE__
#define SETCONST(type, name, value) const type name = value
#else
#define SETCONST(type, name, value) extern const type name
#endif

SETCONST(AnsiString,g_sTest,"Test String");


Übersetzungseinheit:

#define __MAIN_MODULE__
#include "...h"


Meiner Meinung nach sind beide Varianten identisch. Warum kann der Linker
bei der zweiten Variante meine Konstante nicht finden?

Vielen Dank und viele Grüße
Steffen

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Rolf Magnus
Guest





PostPosted: Thu Dec 18, 2003 11:47 am    Post subject: Re: Konstanten im Header Reply with quote

Steffen Liersch wrote:

Quote:
Hallo Thomas,

folgende Konstruktion funktioniert:

im Header:
extern const AnsiString g_sTest;

in Übersetzungseinheit:
const AnsiString g_sTest="Test String";


Damit man nun im Header sieht, mit welchem Wert die Konstante
initialisiert wird, habe ich mir folgendes Makro überlegt:


Header:

#ifdef __MAIN_MODULE__

Dieser Name ist verboten. Alles, was zwei aufeinanderfolgende
Underscores enthält oder mit einem Underscore gefolgt von einem
Großbuchstaben beginnt, ist reserviert und darf nicht verwendet werden.
Wozu überhaupt die ganzen Underscores?

Quote:
#define SETCONST(type, name, value) const type name = value
#else
#define SETCONST(type, name, value) extern const type name
#endif

SETCONST(AnsiString,g_sTest,"Test String");


Übersetzungseinheit:

#define __MAIN_MODULE__
#include "...h"


Meiner Meinung nach sind beide Varianten identisch. Warum kann der
Linker bei der zweiten Variante meine Konstante nicht finden?

Wie Thomas Maeder schon schrieb, haben Konstanten per default internal
linkage, sind also von außen unsichtbar. Schreibe einfach bei der
Definition auch ein "extern" davor.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Steffen Liersch
Guest





PostPosted: Thu Dec 18, 2003 12:16 pm    Post subject: Re: Konstanten im Header Reply with quote

Hall Rolf,

Quote:
#ifdef __MAIN_MODULE__
Dieser Name ist verboten. Alles, was zwei aufeinanderfolgende
Underscores enthält oder mit einem Underscore gefolgt von einem
Großbuchstaben beginnt, ist reserviert und darf nicht verwendet werden.
Wozu überhaupt die ganzen Underscores?

OK, wieder was gelernt, allerdings geht es mit einem erlaubten Namen auch
nicht.

Quote:
Wie Thomas Maeder schon schrieb, haben Konstanten per default internal
linkage, sind also von außen unsichtbar. Schreibe einfach bei der
Definition auch ein "extern" davor.

OK, so funktioniert es, aber wieso geht mein erstes Beispiel dann?

im Header:
extern const AnsiString g_sTest;

in Übersetzungseinheit:
const AnsiString g_sTest="Test String";

Die Makrovariante erzeugt ja auch nichts anderes, oder vielleicht doch?

Vielen Dank und viele Grüße,
Steffen

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Thomas Maeder
Guest





PostPosted: Fri Dec 19, 2003 6:39 am    Post subject: Re: Konstanten im Header Reply with quote

"Steffen Liersch" <steffen_liersch_pub (AT) gmx (DOT) de> writes:

Quote:
OK, so funktioniert es, aber wieso geht mein erstes Beispiel dann?

im Header:
extern const AnsiString g_sTest;

in Übersetzungseinheit:
const AnsiString g_sTest="Test String";

Die Makrovariante erzeugt ja auch nichts anderes, oder vielleicht doch?

Doch.

Die ursprüngliche Makro-Variante erzeugte:

const AnsiString g_sTest="Test String";


Die oben skizzierte Variante erzeugte für die Übersetzungseinheit:

extern const AnsiString g_sTest;
const AnsiString g_sTest="Test String";

, falls sie den Header ebenfalls #included. Die Differenz ist eine extern-
Deklaration.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Steffen Liersch
Guest





PostPosted: Fri Dec 19, 2003 6:58 am    Post subject: Re: Konstanten im Header Reply with quote

Hallo Thomas,

danke für den Tip, jetzt leuchtet mir das ein. Noch eine Frage: Wird durch
Internal Linkage eine Konstante, in jeder Übersetzungseinheit angelegt, oder
benutzen alle Einheiten tatsächlich auch das gleiche Objekt?

Viele Grüße,
Steffen

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Rolf Magnus
Guest





PostPosted: Fri Dec 19, 2003 12:11 pm    Post subject: Re: Konstanten im Header Reply with quote

Steffen Liersch wrote:

Quote:
Hallo Thomas,

danke für den Tip, jetzt leuchtet mir das ein. Noch eine Frage: Wird
durch Internal Linkage eine Konstante, in jeder Übersetzungseinheit
angelegt, oder benutzen alle Einheiten tatsächlich auch das gleiche
Objekt?

Internal linkage bedeutet, daß nur die Übersetzungseinheit, die die
Definition enthält, auf das Objekt zugreifen kann. Es bedeutet also
nicht direkt, daß die Konstante in jeder Übersetzungseinheit angelegt
wird. Wenn du aber in mehreren Übersetzungseinheiten darauf zugreifen
willst, muß jede davon es natürlich separat definieren und enthält
damit natürlich auch seine eigene Konstante.
Mit External linkage dagegen kann eine Übersetzungseinheit auch auf eine
Konstante einer anderen Übersetzungseinheit zugreifen, wenn diese ihr
über eine entsprechende Deklaration bekanntgemacht wird.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.