Hallo zusammen,
ich bin von SUSE 7.3 auf 9.0 umgestiegen und damit auch auf gcc 3.3.1.
Habe heute versucht meine alten C++ Sourcen zu kompilieren aber leider
kläglich gescheitert.
Mir ist es zwar ein wenig peinlich, aber vielleicht kann mir jemand
einen Tipp geben. Die include Files scheint der Compiler zu finden, da
bei falscher Schreibweise auch eine Fehlermeldung kommt.
Hier mal ein winziges Beispiel:
#include<string>
#include <iostream>
#include
Am Sonntag, 15. Februar 2004 14:45 schrieb Gebhard Sieweke:
#include<string> #include <iostream> #include
void main () {
string a;
}
Wenn ich mit g++ Kompiliere kommt folgendes heraus:
g++ test.cpp
test.cpp:6: error: `main' must return `int' test.cpp: In function `int main(...)': test.cpp:8: error: `string' undeclared (first use this function)
Du hast vergessen den namespace anzugeben. Es muss heissen: int main() { std::string a; } Gruss Matthias
On Sunday 15 February 2004 14:45, Gebhard Sieweke wrote:
test.cpp:6: error: `main' must return `int'
Da hat er ja Recht. ;-)
test.cpp: In function `int main(...)': test.cpp:8: error: `string' undeclared (first use this function) test.cpp:8: error: (Each undeclared identifier is reported only once for each function it appears in.) test.cpp:8: error: parse error before `;' token
Seit der 8.2 prüft g++ sehr viel strenger - auch für alle STL-Aufrufe muß man
den Name-Space ("std::") angeben.
Strenggenommen kann man das jedesmal extra:
std::string nachname;
std::string vorname;
std::string strasse;
...aber das macht wenig Spaß und den Code recht unleserlich.
Man kann auch einmal explizit angeben, daß man mit "string" immer
"std::string" meint:
using std::string;
string nachname;
string vorname;
string strasse;
Schlampig wäre es, einfach ganz auf diesen Name-Space umzusteigen:
using namespace std; // BLOSS NICHT!!
CU
--
Stefan Hundhammer
Vielen Dank für die Antwort, hab ich gleich ausprobiert und jetzt geht dieses kleine Beispiel einwandfrei. Wahrscheinlich muss ich zugeben, dass ich in der Vergangenheit wahrscheinlich etwas schlampig programmiert habe. Bisher habe ich Dinge wie namespaces schlicht ignoriert... und main als void zu definieren ging auch immer sehr gut. Prinzipiell finde ich das auch sehr gut wenn man vom Compiler zu eher hochwertigem Code gezwungen wird. Aber mein eigentliches Problem ist nicht diese triviale String Beispiel - vielmehr versuche ich gerade Flex und Bison mit dem gcc 3.3.1 ans Laufen zu bekommen. Das ist dann leider automatisch generierter Source Code und der will irgendwie überhaupt nicht. Das sind Sourcen, die unter SUSE 7.3 bestens funktionierten. Gibt es einen Schalter beim gcc der diesen etwas gnädiger mit meinem dann wohl eher "unsauberen" Code umgehen läßt ?? Oder muß ich eine ältere gcc Version installieren ? Woher bekomme ich die dann ? Gruß und Danke Gebhard Stefan Hundhammer wrote:
On Sunday 15 February 2004 14:45, Gebhard Sieweke wrote:
test.cpp:6: error: `main' must return `int'
Da hat er ja Recht. ;-)
test.cpp: In function `int main(...)': test.cpp:8: error: `string' undeclared (first use this function) test.cpp:8: error: (Each undeclared identifier is reported only once for each function it appears in.) test.cpp:8: error: parse error before `;' token
Seit der 8.2 prüft g++ sehr viel strenger - auch für alle STL-Aufrufe muß man den Name-Space ("std::") angeben.
Strenggenommen kann man das jedesmal extra:
std::string nachname; std::string vorname; std::string strasse;
...aber das macht wenig Spaß und den Code recht unleserlich. Man kann auch einmal explizit angeben, daß man mit "string" immer "std::string" meint:
using std::string;
string nachname; string vorname; string strasse;
Schlampig wäre es, einfach ganz auf diesen Name-Space umzusteigen:
using namespace std; // BLOSS NICHT!!
CU
Gebhard Sieweke wrote:
Vielen Dank für die Antwort,
und bitte in Zukunft keine TOFUs mehr,
Wahrscheinlich muss ich zugeben, dass ich in der Vergangenheit wahrscheinlich etwas schlampig programmiert habe. Bisher habe ich Dinge wie namespaces schlicht ignoriert... und main als void zu definieren ging auch immer sehr gut.
:)
Das sind Sourcen, die unter SUSE 7.3 bestens funktionierten.
dürfte dann gcc 2.95 sein
Gibt es einen Schalter beim gcc der diesen etwas gnädiger mit meinem dann wohl eher "unsauberen" Code umgehen läßt ?? ^^^^^^^ <offtopic>Du plenkst, </offtopic>
keine Ahnung, ist aber sicher nicht im Sinn des Erfinders
Oder muß ich eine ältere gcc Version installieren ? Woher bekomme ich die dann ?
http://gcc.gnu.org/releases.html Andreas
Gebhard.Sieweke@t-online.de (Gebhard Sieweke) [16 Feb 2004 05:20]:
- vielmehr versuche ich gerade Flex und Bison mit dem gcc 3.3.1 ans Laufen zu bekommen. Das ist dann leider automatisch generierter Source Code und der will irgendwie überhaupt nicht.
Das kann eigentlich nicht sein. Etliche der Pakete in SUSE Linux verwenden Flex und wir hätten es gemerkt, wenn tatsächlich flex und gcc nicht miteinander können. Ich müsste aber schon Beispiele sehen, wo der gcc Code zurückweist, um näheres sagen zu können.
Das sind Sourcen, die unter SUSE 7.3 bestens funktionierten. Gibt es einen Schalter beim gcc der diesen etwas gnädiger mit meinem dann wohl eher "unsauberen" Code umgehen läßt??
Nein, den gibt es nicht. Aber wie wäre es, den Code zu korrigieren? Das wäre die deutlich sinnvollere Methode. [Sinnloses Vollzitat] Bitte unterlass solchen TOFU in Zukunft, Danke. Philipp
participants (5)
-
Andreas Loesch
-
Gebhard.Sieweke@t-online.de
-
Matthias Guede
-
Philipp Thomas
-
Stefan Hundhammer