 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Bernhard Holzmayer Guest
|
Posted: Thu Sep 16, 2004 8:56 am Post subject: const <=> extern const |
|
|
Es gibt derzeit eine Diskussion über die Definition von Konstanten.
Dazu hätte ich gerne Eure Meinung bzw. herausgefunden, wie's nun
eigentlich "standesgemäß" ist.
1) Wenn eine Konstante so definiert wird:
const int CI=5;
dann kann ich das in einem Header tun, den mehrere Dateien
importieren, ohne dass es zu Linkproblemen kommt.
Der Linker legt also die Konstante CI nicht als globale Größe im
Speicher ab. (oder ist das falsch?)
Wenn eine Konstante so definiert wird:
extern const int ECI=5;
dann kann ich diese Version nur genau einmal verwenden, sonst gibt
es Linkerfehler (doppelte Definition).
Wenn ich den Initialisierungswert in allen Fällen (außer in einem)
weglasse, dann erhalte ich offensichtlich genau eine Konstante, die
im Speicher als globale Größe an genau einer Stelle abgelegt wird.
Und in allen Fällen wird auf den (an genau einer Stelle) angegebenen
Initialisierungswert Bezug genommen.
Um diese Konstante z.B. von zugelinkten weiteren Programmteilen
(z.B. in anderen Programmiersprachen erstellten) aus verwenden zu
können, wäre die richtige Vorgehensweise also, an einer Stelle die
Konstante mit
extern const int ECI=5;
zu definieren, und sie dann mittels der Deklaration
extern const int ECI;
für die weiteren C++ Quellen verfügbar zu machen.
Die Konstante wird dann auch vom Linker im Programm abgelegt, so
dass sie von weiteren zugelinkten Modulen (z.B. Assembler)
verwendet werden kann (Die Problematik von name mangling ist mir
bewusst)
Sehe ich das richtig?
2) Wenn ich eine solche extern Deklaration habe, wie z.B.
extern const int ECI;
was passiert dann eigentlich, wenn ich in einer anderen Datei
const int ECI=4;
schreibe?
Offensichtlich gibt es da für den Compiler/Linker kein Problem?
Eigentlich existieren doch im Namensraum zwei verschiedene
Definitionen.
Bernhard
--
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 |
|
 |
Marcel Müller Guest
|
Posted: Thu Sep 16, 2004 10:13 am Post subject: Re: const <=> extern const |
|
|
Bernhard Holzmayer wrote:
| Quote: | Es gibt derzeit eine Diskussion über die Definition von Konstanten.
Dazu hätte ich gerne Eure Meinung bzw. herausgefunden, wie's nun
eigentlich "standesgemäß" ist.
1) Wenn eine Konstante so definiert wird:
const int CI=5;
dann kann ich das in einem Header tun, den mehrere Dateien
importieren, ohne dass es zu Linkproblemen kommt.
Der Linker legt also die Konstante CI nicht als globale Größe im
Speicher ab. (oder ist das falsch?)
|
Soweit ich weiß müßte es heißen:
static const int CI=5;
dann wäre die Aussage richtig.
Obiges _kann_ gutgehen, wen der Compiler (und nicht der Linker) beim
Optimieren feststellt, daß die Variable CI gar nicht gebraucht wird und
immer im Code inline eingefügt werden kann.
Das geht solange gut, bis man an einer Stelle schreibt:
void foo(const int* x);
....
foo(CI);
Normalerweise werden alle nicht-statischen Variablen und Funktionen
außerhalb von Klassen als Namen exportiert.
(Oder ergänzen die Compiler das static bei const automatisch?)
| Quote: | Wenn eine Konstante so definiert wird:
extern const int ECI=5;
|
Soweit ich weiß ist das identisch mit
const int ECI=5;
| Quote: | Um diese Konstante z.B. von zugelinkten weiteren Programmteilen
(z.B. in anderen Programmiersprachen erstellten) aus verwenden zu
können, wäre die richtige Vorgehensweise also, an einer Stelle die
Konstante mit
extern const int ECI=5;
zu definieren, und sie dann mittels der Deklaration
extern const int ECI;
für die weiteren C++ Quellen verfügbar zu machen.
|
Ja.
| Quote: | was passiert dann eigentlich, wenn ich in einer anderen Datei
const int ECI=4;
schreibe?
Offensichtlich gibt es da für den Compiler/Linker kein Problem?
Eigentlich existieren doch im Namensraum zwei verschiedene
Definitionen.
|
Das hätte ich jetzt auch gesagt...
Marcel
--
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 |
|
 |
Christoph Rabel Guest
|
Posted: Thu Sep 16, 2004 12:05 pm Post subject: Re: const <=> extern const |
|
|
Bernhard Holzmayer wrote:
| Quote: | Dazu hätte ich gerne Eure Meinung bzw. herausgefunden, wie's nun
eigentlich "standesgemäß" ist.
|
Mit namespaces.
| Quote: | 1) Wenn eine Konstante so definiert wird:
const int CI=5;
dann kann ich das in einem Header tun, den mehrere Dateien
importieren, ohne dass es zu Linkproblemen kommt.
|
Das liegt daran, das Variable auf Filescope automatisch static sind.
static bedeutet in diesem Kontext, nur innerhalb der Übersetzungseinheit
sichtbar.
| Quote: | Der Linker legt also die Konstante CI nicht als globale Größe im
Speicher ab. (oder ist das falsch?)
|
Der Linker weis nicht mal, dass CI existiert. Die Konstante wird vom
Compiler eingesetzt.
| Quote: | Wenn eine Konstante so definiert wird:
extern const int ECI=5;
dann kann ich diese Version nur genau einmal verwenden, sonst gibt
es Linkerfehler (doppelte Definition).
|
Ja. Damit wird die Variable in jeder Übersetzungseinheit vom Compiler
erzeugt und dem Linker gegeben. Dieser hat auf einmal mehrere
Definitionen der Variable und ist verwirrt.
Es gibt allerdings bei einigen Compilern Schalter, damit er die
doppelten Definitionen ignoriert.
| Quote: | Wenn ich den Initialisierungswert in allen Fällen (außer in einem)
weglasse, dann erhalte ich offensichtlich genau eine Konstante, die
im Speicher als globale Größe an genau einer Stelle abgelegt wird.
Und in allen Fällen wird auf den (an genau einer Stelle) angegebenen
Initialisierungswert Bezug genommen.
|
extern const int ECI;
ist nur eine Deklaration, keine Definition. Damit sagst du dem Compiler:
Vertrau mir, es gibt einen int namens CI, den setzt später der Linker ein.
extern const int ECI=5;
Damit sagst du: Mach einen int namens CI und stell ihn auch dem Linker
zur Verfügung, der braucht ihn noch anderswo.
| Quote: | Um diese Konstante z.B. von zugelinkten weiteren Programmteilen
(z.B. in anderen Programmiersprachen erstellten) aus verwenden zu
können, wäre die richtige Vorgehensweise also, an einer Stelle die
Konstante mit
extern const int ECI=5;
zu definieren, und sie dann mittels der Deklaration
extern const int ECI;
für die weiteren C++ Quellen verfügbar zu machen.
|
Genau!
| Quote: | Die Konstante wird dann auch vom Linker im Programm abgelegt, so
dass sie von weiteren zugelinkten Modulen (z.B. Assembler)
verwendet werden kann (Die Problematik von name mangling ist mir
bewusst)
Sehe ich das richtig?
|
Ja. Hätte zuerst fertig lesen sollen, hätte mir ein bisserl
Schreibarbeit erspart ;-)
| Quote: | 2) Wenn ich eine solche extern Deklaration habe, wie z.B.
extern const int ECI;
was passiert dann eigentlich, wenn ich in einer anderen Datei
const int ECI=4;
schreibe?
Offensichtlich gibt es da für den Compiler/Linker kein Problem?
Eigentlich existieren doch im Namensraum zwei verschiedene
Definitionen.
|
Aufgrund des impliziten static hast du kein Problem.
mfg
Christoph
--
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 |
|
 |
Markus Schaaf Guest
|
Posted: Thu Sep 16, 2004 2:11 pm Post subject: Re: const <=> extern const |
|
|
"Bernhard Holzmayer" <holzmayer.bernhard (AT) deadspam (DOT) com> schrieb:
| Quote: | 1) Wenn eine Konstante so definiert wird:
const int CI=5;
|
Hat »CI« "internal linkage", d.h. ist nur in dieser Übersetzungseinheit
sichtbar. Das ist das gleiche wie »static« in C. Dieser Umstand wird
durch das Schlüsselwort »const« ausgelöst. Ohne »const« hätte »CI«
"external linkage".
| Quote: | Wenn eine Konstante so definiert wird:
extern const int ECI=5;
|
Bekommst Du "external linkage", wegen »extern«. Ohne »=5« wäre das
jedoch nur eine 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 |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Thu Sep 16, 2004 2:27 pm Post subject: Re: const <=> extern const |
|
|
Marcel Müller <news.5.maazl (AT) spamgourmet (DOT) org> wrote
| Quote: | Bernhard Holzmayer wrote:
Es gibt derzeit eine Diskussion über die Definition von Konstanten.
Dazu hätte ich gerne Eure Meinung bzw. herausgefunden, wie's nun
eigentlich "standesgemäß" ist.
1) Wenn eine Konstante so definiert wird:
const int CI=5;
dann kann ich das in einem Header tun, den mehrere Dateien
importieren, ohne dass es zu Linkproblemen kommt.
Der Linker legt also die Konstante CI nicht als globale Größe im
Speicher ab. (oder ist das falsch?)
Soweit ich weiß müßte es heißen:
static const int CI=5;
dann wäre die Aussage richtig.
|
Laut der Norm sind const Variable defaultmäßig static. Man muss extern
verwenden, wenn man es anders wünscht.
| Quote: | Obiges _kann_ gutgehen, wen der Compiler (und nicht der Linker) beim
Optimieren feststellt, daß die Variable CI gar nicht gebraucht wird
und immer im Code inline eingefügt werden kann.
|
Das kann er nur, wenn die Variable static ist. Amsonsten kann er nie
wissen, ob nicht in einer anderen Modul die Adresse genommen wurde.
| Quote: | Das geht solange gut, bis man an einer Stelle schreibt:
void foo(const int* x);
...
foo(CI);
|
Was naturlich nicht kompiliert, weil man versucht, ein int als Zeiger zu
benutzen.
| Quote: | Normalerweise werden alle nicht-statischen Variablen und Funktionen
außerhalb von Klassen als Namen exportiert. (Oder ergänzen die
Compiler das static bei const automatisch?)
Wenn eine Konstante so definiert wird:
extern const int ECI=5;
Soweit ich weiß ist das identisch mit
const int ECI=5;
|
Nein. Sie wären identisch, wenn die Variable nicht const wäre.
| Quote: | Um diese Konstante z.B. von zugelinkten weiteren Programmteilen
(z.B. in anderen Programmiersprachen erstellten) aus verwenden zu
können, wäre die richtige Vorgehensweise also, an einer Stelle die
Konstante mit
extern const int ECI=5;
zu definieren, und sie dann mittels der Deklaration
extern const int ECI;
für die weiteren C++ Quellen verfügbar zu machen.
Ja.
was passiert dann eigentlich, wenn ich in einer anderen Datei
const int ECI=4;
schreibe?
|
Wenn der Compiler schon die Declaration mit extern gesehen hat, und
beide Declarationen im selben scope sind, dans geht. Der extern gilt für
beide.
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
--
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 |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Thu Sep 16, 2004 2:27 pm Post subject: Re: const <=> extern const |
|
|
Marcel Müller <news.5.maazl (AT) spamgourmet (DOT) org> wrote
| Quote: | Bernhard Holzmayer wrote:
Es gibt derzeit eine Diskussion über die Definition von Konstanten.
Dazu hätte ich gerne Eure Meinung bzw. herausgefunden, wie's nun
eigentlich "standesgemäß" ist.
1) Wenn eine Konstante so definiert wird:
const int CI=5;
dann kann ich das in einem Header tun, den mehrere Dateien
importieren, ohne dass es zu Linkproblemen kommt.
Der Linker legt also die Konstante CI nicht als globale Größe im
Speicher ab. (oder ist das falsch?)
Soweit ich weiß müßte es heißen:
static const int CI=5;
dann wäre die Aussage richtig.
|
Laut der Norm sind const Variable defaultmäßig static. Man muss extern
verwenden, wenn man es anders wünscht.
| Quote: | Obiges _kann_ gutgehen, wen der Compiler (und nicht der Linker) beim
Optimieren feststellt, daß die Variable CI gar nicht gebraucht wird
und immer im Code inline eingefügt werden kann.
|
Das kann er nur, wenn die Variable static ist. Amsonsten kann er nie
wissen, ob nicht in einer anderen Modul die Adresse genommen wurde.
| Quote: | Das geht solange gut, bis man an einer Stelle schreibt:
void foo(const int* x);
...
foo(CI);
|
Was naturlich nicht kompiliert, weil man versucht, ein int als Zeiger zu
benutzen.
| Quote: | Normalerweise werden alle nicht-statischen Variablen und Funktionen
außerhalb von Klassen als Namen exportiert. (Oder ergänzen die
Compiler das static bei const automatisch?)
Wenn eine Konstante so definiert wird:
extern const int ECI=5;
Soweit ich weiß ist das identisch mit
const int ECI=5;
|
Nein. Sie wären identisch, wenn die Variable nicht const wäre.
| Quote: | Um diese Konstante z.B. von zugelinkten weiteren Programmteilen
(z.B. in anderen Programmiersprachen erstellten) aus verwenden zu
können, wäre die richtige Vorgehensweise also, an einer Stelle die
Konstante mit
extern const int ECI=5;
zu definieren, und sie dann mittels der Deklaration
extern const int ECI;
für die weiteren C++ Quellen verfügbar zu machen.
Ja.
was passiert dann eigentlich, wenn ich in einer anderen Datei
const int ECI=4;
schreibe?
|
Wenn der Compiler schon die Declaration mit extern gesehen hat, und
beide Declarationen im selben scope sind, dans geht. Der extern gilt für
beide.
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
--
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 |
|
 |
Bernhard Holzmayer Guest
|
Posted: Fri Sep 17, 2004 6:05 am Post subject: Re: const <=> extern const |
|
|
[email]kanze (AT) gabi-soft (DOT) fr[/email] wrote:
| Quote: |
was passiert dann eigentlich, wenn ich in einer anderen Datei
const int ECI=4;
schreibe?
Wenn der Compiler schon die Declaration mit extern gesehen hat,
und beide Declarationen im selben scope sind, dans geht. Der
extern gilt für beide.
|
Ich habe das mit dem gcc ausprobiert.
extern const int ECI=5; in einer anderen Datei.
extern const int ECI; im Header, der in die Datei x.cc importiert
wird.
const int ECI=4 in der Datei x.cc
Es gibt in diesem Fall keine Warnung und keinen Fehler, sondern der
Compiler nimmt schön brav die ECI=4 Definition.
Die an anderem Ort (über den Header) verbreitete
extern const int ECI; ignoriert er hier offensichtlich.
Offensichtlich hat die lokale Definition eine Art Priorität.
Auch der Linker schluckt das (weil ihn die lokale ja nix angeht).
Intuitiv ist mir das klar. Der Compiler sieht zwar, dass es eine
externe Definition gibt. Aber weil im Header ja nur die Deklaration
steht und nicht der Wert, weil der Compiler aber gesagt kriegt, das
die lokale Definition const ist und der Wert 4, darf der Compiler
ja davon ausgehen, dass irgendwo anders auch die Definition mit 4
vorliegt (sonst hätte ich ihn ja belogen...).
Aber ich denke, das ist kein Verhalten, das einer ISO-Norm würdig
wäre, also wird's sicher nicht konform sein. Oder?
Bernhard
--
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 |
|
 |
Horst Kraemer Guest
|
Posted: Sat Sep 18, 2004 8:08 am Post subject: Re: const <=> extern const |
|
|
Bernhard Holzmayer <holzmayer.bernhard (AT) deadspam (DOT) com> wrote:
| Quote: | kanze (AT) gabi-soft (DOT) fr wrote:
was passiert dann eigentlich, wenn ich in einer anderen Datei
const int ECI=4;
schreibe?
Wenn der Compiler schon die Declaration mit extern gesehen hat,
und beide Declarationen im selben scope sind, dans geht. Der
extern gilt für beide.
Ich habe das mit dem gcc ausprobiert.
extern const int ECI=5; in einer anderen Datei.
extern const int ECI; im Header, der in die Datei x.cc importiert
wird.
const int ECI=4 in der Datei x.cc
Es gibt in diesem Fall keine Warnung und keinen Fehler, sondern der
Compiler nimmt schön brav die ECI=4 Definition.
Die an anderem Ort (über den Header) verbreitete
extern const int ECI; ignoriert er hier offensichtlich.
Offensichtlich hat die lokale Definition eine Art Priorität.
Auch der Linker schluckt das (weil ihn die lokale ja nix angeht).
Intuitiv ist mir das klar. Der Compiler sieht zwar, dass es eine
externe Definition gibt. Aber weil im Header ja nur die Deklaration
steht und nicht der Wert, weil der Compiler aber gesagt kriegt, das
die lokale Definition const ist und der Wert 4, darf der Compiler
ja davon ausgehen, dass irgendwo anders auch die Definition mit 4
vorliegt (sonst hätte ich ihn ja belogen...).
Aber ich denke, das ist kein Verhalten, das einer ISO-Norm würdig
wäre, also wird's sicher nicht konform sein. Oder?
|
Doch doch. Dieses Verhalten wird vom Standard gefordert, auch wenn es
manche Compiler anders sehen und einen Fehler melden.
const int i=5;
ist in C++ nicht unter allen Umstaenden aequivalent zu
static const int i=5;
wie vielfach behauptet. Es ist aequivalent zu static const, es sei
denn, das Objekt wurde vorher als extern deklariert, d.h. hier
extern const int i;
const int i=5;
hat das i mit dem Wert 5 "external linkage" und die Sequenz ist
aequivalent zu
extern const int i=5;
und die Sequenz
extern const int i;
static const int i=5;
ist unzulaessig.
Anders hier:
const int i=5;
extern const i;
ist aequivalent zu
static const int i=5;
extern const i;
und das extern const i bezieht sich auf das static const i und i hat
hier "internal linkage".
--
Horst
--
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 |
|
 |
Bernhard Holzmayer Guest
|
Posted: Mon Sep 20, 2004 5:23 am Post subject: Re: const <=> extern const |
|
|
Horst Kraemer wrote:
| Quote: |
Anders hier:
const int i=5;
extern const i;
ist aequivalent zu
static const int i=5;
extern const i;
und das extern const i bezieht sich auf das static const i und i
hat hier "internal linkage".
|
Vielleicht habe ich mich undeutlich ausgedrückt, oder ich habe die
Antwort nicht ganz verstanden:
nach dem Auflösen des Headers (nach dem Preprocessing) haben wir in
der Datei x.cc folgende Zeilen in dieser Reihenfolge:
extern const int ECI;
const int ECI = 4;
Das ist also das, was der Compiler sieht.
In einer anderen Datei steht (also für den Compiler hier
unsichtbar):
extern const int ECI=5;
In den anderen Dateien wird ECI mit 5 verwendet, in der Datei x.cc
wird jedoch der Wert ECI == 4 verwendet.
Kein Fehler, keine Warnung, weder vom Compiler noch vom Linker.
Das ist für mich irritierend. Und darauf habe ich mich bezogen.
Vielleicht bin ich aber einfach zu anspruchsvoll - oder seh was
nicht.
Bernhard
--
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 |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Mon Sep 20, 2004 1:43 pm Post subject: Re: const <=> extern const |
|
|
Bernhard Holzmayer <holzmayer.bernhard (AT) deadspam (DOT) com> wrote
| Quote: | kanze (AT) gabi-soft (DOT) fr wrote:
was passiert dann eigentlich, wenn ich in einer anderen Datei
const int ECI=4; schreibe?
Wenn der Compiler schon die Declaration mit extern gesehen hat, und
beide Declarationen im selben scope sind, dans geht. Der extern gilt
für beide.
Ich habe das mit dem gcc ausprobiert.
extern const int ECI=5; in einer anderen Datei.
extern const int ECI; im Header, der in die Datei x.cc importiert
wird.
const int ECI=4 in der Datei x.cc
|
Das darfst Du nicht. Die zweite Vereinbarung übernimmt den Linkage der
ersten. Also hast Du ECI in x.cc global definiert. Wenn Du es auch
anderswo definiert hast, dann hat dein Programme ein undefiniertes
Verhalten.
| Quote: | Es gibt in diesem Fall keine Warnung und keinen Fehler, sondern der
Compiler nimmt schön brav die ECI=4 Definition. Die an anderem Ort
(über den Header) verbreitete extern const int ECI; ignoriert er hier
offensichtlich.
|
Es kann daraufkommen, was Du mit den Variablen tust. Zum Beispiel, wenn
Du die Adresse in den zwei Quellen nimmst, kann es sein, dass der Linker
schimpft.
Oder nicht. Du hast undefiniertes Verhalten eingebaut, und der Compiler
kann daraus machen, was er will.
| Quote: | Offensichtlich hat die lokale Definition eine Art Priorität.
|
Oder nicht. Wahrscheinlich geht der Compiler davon aus, dass es keine
andere Definition gibt.
| Quote: | Auch der Linker schluckt das (weil ihn die lokale ja nix angeht).
|
Wahrscheinlicher weil er auf irgendeinem Grund die andere Datei nicht
mitgelinkt hat. Bei mir schimpft er wohl wegen mehrfacher Definitionen.
Ob g++ oder Sun CC.
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
--
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 |
|
 |
Bernhard Holzmayer Guest
|
Posted: Tue Sep 21, 2004 5:04 am Post subject: Re: const <=> extern const |
|
|
[email]kanze (AT) gabi-soft (DOT) fr[/email] wrote:
| Quote: |
Auch der Linker schluckt das (weil ihn die lokale ja nix angeht).
Wahrscheinlicher weil er auf irgendeinem Grund die andere Datei
nicht mitgelinkt hat. Bei mir schimpft er wohl wegen mehrfacher
Definitionen. Ob g++ oder Sun CC.
|
Doch, die ist mitgelinkt. Da steckt eine Funktion mit drin, die auch
munter verwendet wird. g++ --version ==> 2.95.3
Dem Rest Deiner Ausführungen stimme ich vollständig zu;
ich vermute ebenfalls, dass das eine Grauzone "undefiniertes
Verhalten" ist. Und ich kann damit leben.
Mir ging es mehr drum, ob ich das nun richtig verstehe - oder ob ich
einen Denkfehler habe...
Danke für die Ausführungen (auch den anderen)
Bernhard
--
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 |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Tue Sep 21, 2004 8:09 am Post subject: Re: const <=> extern const |
|
|
Bernhard Holzmayer <holzmayer.bernhard (AT) deadspam (DOT) com> wrote
| Quote: | Horst Kraemer wrote:
Anders hier:
const int i=5;
extern const i;
ist aequivalent zu
static const int i=5;
extern const i;
und das extern const i bezieht sich auf das static const i und i hat
hier "internal linkage".
Vielleicht habe ich mich undeutlich ausgedrückt, oder ich habe die
Antwort nicht ganz verstanden:
nach dem Auflösen des Headers (nach dem Preprocessing) haben wir in
der Datei x.cc folgende Zeilen in dieser Reihenfolge:
extern const int ECI;
const int ECI = 4;
Das ist also das, was der Compiler sieht.
In einer anderen Datei steht (also für den Compiler hier
unsichtbar):
extern const int ECI=5;
In den anderen Dateien wird ECI mit 5 verwendet, in der Datei x.cc
wird jedoch der Wert ECI == 4 verwendet.
Kein Fehler, keine Warnung, weder vom Compiler noch vom Linker.
|
So habe ich es verstanden. Bei mir gibt's einen Fehler vom Linker. Aber
laut der Norm ist es ein undefiniertes Verhalten; weder der Linker noch
der Compiler ist gezwungen, einen Fehler zu melden.
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
--
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 |
|
 |
Horst Kraemer Guest
|
Posted: Wed Sep 22, 2004 5:43 am Post subject: Re: const <=> extern const |
|
|
Bernhard Holzmayer <holzmayer.bernhard (AT) deadspam (DOT) com> wrote:
| Quote: | Horst Kraemer wrote:
Anders hier:
const int i=5;
extern const i;
ist aequivalent zu
static const int i=5;
extern const i;
und das extern const i bezieht sich auf das static const i und i
hat hier "internal linkage".
Vielleicht habe ich mich undeutlich ausgedrückt, oder ich habe die
Antwort nicht ganz verstanden:
nach dem Auflösen des Headers (nach dem Preprocessing) haben wir in
der Datei x.cc folgende Zeilen in dieser Reihenfolge:
extern const int ECI;
const int ECI = 4;
Das ist also das, was der Compiler sieht.
In einer anderen Datei steht (also für den Compiler hier
unsichtbar):
extern const int ECI=5;
In den anderen Dateien wird ECI mit 5 verwendet, in der Datei x.cc
wird jedoch der Wert ECI == 4 verwendet.
Kein Fehler, keine Warnung, weder vom Compiler noch vom Linker.
Das ist für mich irritierend. Und darauf habe ich mich bezogen.
Vielleicht bin ich aber einfach zu anspruchsvoll - oder seh was
nicht.
|
Alles OK. Ich hatte Deine Nachricht zunaechst missverstanden. Hier
hast Du ein klassisches "undefined behavior". Ein "undefined behavior"
ist per Definition die Folge eines Programmfehlers, den die
Implementierung *nicht* bemerken muss. Dein Compiler/Linker verhaelt
sich also nach C++-Standard voellig korrekt.
--
Horst
--
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 |
|
 |
news Guest
|
Posted: Fri Nov 19, 2004 5:03 pm Post subject: Re: const <=> extern const |
|
|
Hey das thema behandeln wir gerade in der schule ;)
Also das ganze ist folgendermassen
Es gibt bei der Modularisierung "Import Module" und "Export Module"
In der Regel ist das Import-Modul, das Modul das die Main()-funktion enthält
und alle anderen Module sind die export-Module,wobei diese für wiederum
Import-Module sein können.
Const-Bezeichner haben standartmäßig einen internal-Linkage-default. Das
heißt sie haben automatisch den static-Speicherklassen Spezifizierer.
Wenn ich einen Konstante modul-global bekannt machen will muss diese zum
Beispiel in dem modul.cpp mit
Extern const T con = value;
definiert werden.
Um die gerade definierte Konstante in main.cpp benutzen zu können, muss
diese in der Datei mit
extern const T con;
deklariert werden und es ist kein (=value)-initialiserer erlaubt, da dies
eine definition bewirkt.
Gruss
--
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 |
|
 |
Horst Kraemer Guest
|
Posted: Sat Nov 20, 2004 10:37 am Post subject: Re: const <=> extern const |
|
|
"news" <news (AT) fe06-unl (DOT) iad01.newshosting.com> wrote:
| Quote: | Hey das thema behandeln wir gerade in der schule ;)
Also das ganze ist folgendermassen
Es gibt bei der Modularisierung "Import Module" und "Export Module"
In der Regel ist das Import-Modul, das Modul das die Main()-funktion enthält
und alle anderen Module sind die export-Module,wobei diese für wiederum
Import-Module sein können.
Const-Bezeichner haben standartmäßig einen internal-Linkage-default. Das
heißt sie haben automatisch den static-Speicherklassen Spezifizierer.
|
...ausser wenn sie vorher bereits in demselben Namespace als extern
deklariert sind, z.B. hier
extern const int i; // moeglicherweise aus einem Header hereingezogen
const int i = 42;
bezeichnet das in der zweiten Deklaration auftretende i das in der
ersten Deklaration deklarierte Objekt und dies hat external linkage,
d.h. hier ist die zweite Zeile aequivalent zu
extern const int i = 42;
--
Horst
--
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 |
|
 |
|
|
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
|
|