extern const Probleme
-
Hi zusammen,
main.cpp
#include <iostream> #include <memory> #include "header.hpp" extern const int ARRAYSIZE=10; int main() { std::array<int, ARRAYSIZE> fooArray; array_fill(fooArray); array_ausgabe(fooArray); return 0; }header.hpp
#ifndef HEADER_HPP #define HEADER_HPP extern const int ARRAYSIZE; void array_fill(std::array<int, ARRAYSIZE> &foo); void array_ausgabe(std::array<int, ARRAYSIZE> &foo); #endifheader.cpp
#include <iostream> #include <memory> #include "header.hpp" extern const int ARRAYSIZE; void array_fill(std::array<int, ARRAYSIZE> &foo) { for (int i=0;i<ARRAYSIZE;i++) foo[i]=i; } void array_ausgabe(std::array<int, ARRAYSIZE> &foo) { for (int i=0;i<ARRAYSIZE;i++) std::cout << " " << foo[i]; }gcc -Wall -pedantic -o main.exe main.cpp header.cppganz viele Fehler wegen ARRAYSIZE ......
http://s1.directupload.net/images/131205/omabzy86.pngZu extern hab ich natürlich Literatur da.
Aber das ungewöhnliche ist wohl, dass die const Zahl im Header auch in .hpp vorkommt. Alles was ich in der Literatur oder im Internet dazu gefunden habe, beschäftigt sich nur damit, dass eine const Zahl nur in .cpp vorkommt...
Vielen Dank und
die besten Grüße!
-
mit vorbehalt:
in main.cpp:
gar nichts, komplett weg.in header.hpp:
so wie es atm ist.in header.cpp:
extern weg, sonst so wie es ist.
-
Nimm ARRAYSIZE in main.cpp das extern weg. Da wohnt sie dann und überall sonst ist sie eben extern.
-
Lymogry schrieb:
ganz viele Fehler wegen ARRAYSIZE ......
Die du uns nicht vorenthalten solltest (jedenfalls nicht den ersten).
Die Fehlermeldung dürfte dahingehend lauten, dass ARRAYSIZE kein konstanter Ausdruck sei.
Ein Ausdruck, der auf eine const-qualifizierte Variable verweist, ist nur dann ein konstanter Ausdruck, wenn die Variable zuvor mit einem konstanten Ausdruck initialisiert wurde.
Andererseits würde eine Initialisierung bei einer nicht-lokalen Variable die Deklaration automatisch in eine Definition verwandeln, was zum Problem wird, sobald die Variable in mehreren ÜEs verwendet werden soll.
Schlussfolgerung: nicht-lokale Konstanten mit externer Bindung sind als Templateparameter ungeeignet.
Wahrscheinlich besteht aber auch gar keine Notwendigkeit, dieser Konstante externe Bindung mitzugeben.
-
asfsdf schrieb:
mit vorbehalt:
in main.cpp:
gar nichts, komplett weg.in header.hpp:
so wie es atm ist.in header.cpp:
extern weg, sonst so wie es ist.Das geht leider nicht.
Nimm ARRAYSIZE in main.cpp das extern weg. Da wohnt sie dann und überall sonst ist sie eben extern.
Das geht auch nicht.

So wie ich das verstanden habe, sind die Vorschläge möglich, wenn es kein const ist.

-
Ok. Also hier ist der Fehler
http://s1.directupload.net/images/131205/omabzy86.pngBei der Kompilierung die ganz oben im Eingangsthread steht.
Camper schrieb:
Schlussfolgerung: nicht-lokale Konstanten mit externer Bindung sind als Templateparameter ungeeignet.
Wahrscheinlich besteht aber auch gar keine Notwendigkeit, dieser Konstante externe Bindung mitzugeben.Hallo Camper.

Leider versteh ich noch nicht, was nun zu tun ist ...
-
Lymogry schrieb:
asfsdf schrieb:
mit vorbehalt:
in main.cpp:
gar nichts, komplett weg.in header.hpp:
so wie es atm ist.in header.cpp:
extern weg, sonst so wie es ist.Das geht leider nicht.
Lymogry schrieb:
Camper schrieb:
Schlussfolgerung: nicht-lokale Konstanten mit externer Bindung sind als Templateparameter ungeeignet.
Wahrscheinlich besteht aber auch gar keine Notwendigkeit, dieser Konstante externe Bindung mitzugeben.Hallo Camper.

Leider versteh ich noch nicht, was nun zu tun ist ...
Ich auch nicht, da ich nicht weiss, welchen Beschränkungen eine potentielle Lösung genügen muss.
-
In den Header (ich meine nicht den Dateinamen) kommt
const int ARRAYSIZE=10;in die anderen Dateien nichts.
-
Beschränkungen?
Ein Array fester Größe soll in mehreren geteilten Headern verfügbar sein. (Ich sortiere meine Fkten gerade nach Outout Header, Algorithmus Header, Input Header usw.)Eigentlich hab ich ein 2D Array. Das will ich aber nicht 2D speichern, sondern nur 1D (<int, ARRAYSIZE*ARRAYSIZE>) und mit ARRAYSIZE*y+x durchlaufen.
Also bin ich sehr dadran interessiert, diese Größe überall verfügbar zu haben.
-
manni66 schrieb:
In den Header (ich meine nicht den Dateinamen) kommt
const int ARRAYSIZE=10;in die anderen Dateien nichts.
Hallo Manni,
so siehts danach aus:
http://s1.directupload.net/images/131205/5nerkl3e.png(das versteh ich nun gar nicht mehr)

-
Lymogry schrieb:
so siehts danach aus:
http://s1.directupload.net/images/131205/5nerkl3e.png(das versteh ich nun gar nicht mehr)

Warum steht da noch extern?
-
ups!!!
Ok, ohne klappts!
Und funktioniert das zufällig auch, wenn ich mehrere header1 header2 habe ..

(so ist das Ursprungsproblem!)
-
Ja, solche Konstanten haben implizite internal linkage, heißt du bekommst keine Probleme wegen doppelten Definitionen wenn der Header mehrmals eingebunden wird.
-
Vielen Dank euch allen!
Es funktioniert.
