nichtmal Hallo-welt?!
nichtmal Hallo-welt?!
Hi,
hab auf meinem Knoppix mal ein hallo-Welt-Programm geschrieben.
#include <iostream>
int main(void)
{
cout << "Hallo!\n";
return 0;
}
aber:
auf: gcc test.cpp
kommt:
test.cpp: In function `int main()':
test.cpp:5: `cout' undeclared (first use this function)
test.cpp:5: (Each undeclared identifier is reported only once for each function
it appears in.)
Soweit ich mich an meine C++ Anfänge erinnere, kann man im Source da nicht viel falsch machen.
Im iostream sollte doch wenigstens cout enthalten sein?!
Was läuft da falsch?
cu Desian
hab auf meinem Knoppix mal ein hallo-Welt-Programm geschrieben.
#include <iostream>
int main(void)
{
cout << "Hallo!\n";
return 0;
}
aber:
auf: gcc test.cpp
kommt:
test.cpp: In function `int main()':
test.cpp:5: `cout' undeclared (first use this function)
test.cpp:5: (Each undeclared identifier is reported only once for each function
it appears in.)
Soweit ich mich an meine C++ Anfänge erinnere, kann man im Source da nicht viel falsch machen.
Im iostream sollte doch wenigstens cout enthalten sein?!
Was läuft da falsch?
cu Desian
-
- Beiträge: 96
- Registriert: 17.07.2002 17:04:22
- Lizenz eigener Beiträge: GNU Free Documentation License
Hallo,
ich habe das mal kurz nachvollzogen und keine Probleme gehabt, das Beispiel zu übersetzen. Allerdings ist man gcc nach der Aufruf g++ für C++ richtig. Also versuch es dochmal mit g++ -o test test.cpp -- vielleicht geht es ja dann. Ein kurzer Gegencheck mit gcc ergab die gleiche Fehlermeldung.
Viele Grüße,
Jens.
ich habe das mal kurz nachvollzogen und keine Probleme gehabt, das Beispiel zu übersetzen. Allerdings ist man gcc nach der Aufruf g++ für C++ richtig. Also versuch es dochmal mit g++ -o test test.cpp -- vielleicht geht es ja dann. Ein kurzer Gegencheck mit gcc ergab die gleiche Fehlermeldung.
Viele Grüße,
Jens.
Hm, dann ist der Compiler aber nicht so ganz C++-standardkonform. Im obigen Code fehlt der Namespace. Alles aus der C++-Standardlibrary liegt im Namespace std. Also dem Code entweder einJens Oeser hat geschrieben:ich habe das mal kurz nachvollzogen und keine Probleme gehabt, das Beispiel zu übersetzen.
Code: Alles auswählen
using namespace std;
Code: Alles auswählen
std::cout << "Hallo!\n";
-
- Beiträge: 96
- Registriert: 17.07.2002 17:04:22
- Lizenz eigener Beiträge: GNU Free Documentation License
Ok, ich habe das vorhin mit dem gcc Version 2.95.4 nachgeprüft. Jetzt auf Deinen Hinweis hin habe ich es nochmal mit der Version 3.3 und siehe da, ich muss std::cout schreiben.spiffi hat geschrieben: Hm, dann ist der Compiler aber nicht so ganz C++-standardkonform.
Was sagt uns das, der gcc in Version 2.95.4 ist doch noch nicht ganz so standardkonform wie ich gedacht hatte.
Viele Grüße,
Jens.
- jack herer
- Beiträge: 94
- Registriert: 28.07.2003 19:48:17
Ich glaub der g++ kennt namespaces erst seit der Version 3.0. In der Version 2.9.x gibt es keine namespaces, deswegen ist die Funktion cout überall bekannt...Jens Oeser hat geschrieben: Was sagt uns das, der gcc in Version 2.95.4 ist doch noch nicht ganz so standardkonform wie ich gedacht hatte.
Wenn man die namespaces nicht definieren will, kann man an die include Datei ein ".h" anhängen, dann wird immer std::cout benutzt...
Grüße!
Namespaces gabes schon früher, iostream und iostream.h sind nicht das selbe. Der gcc hält sich nur pingeliger an den Standard (was auch gut ist). Ein paar Hinweise darüber findest du http://www.cplusplus.com/doc/tutorial/tut5-2.html hier im letzten Teil oder halt bei googel.jack herer hat geschrieben: Ich glaub der g++ kennt namespaces erst seit der Version 3.0. In der Version 2.9.x gibt es keine namespaces, deswegen ist die Funktion cout überall bekannt...
Wenn man die namespaces nicht definieren will, kann man an die include Datei ein ".h" anhängen, dann wird immer std::cout benutzt...
Grüße!
cu
- jack herer
- Beiträge: 94
- Registriert: 28.07.2003 19:48:17
Ok, hab mich wohl falsch ausgedrückt, der g++ kennt den namespace std für cout erst seit der Version 3.0. Bei dem 2.9er war cout noch global.tylerD hat geschrieben:Namespaces gabes schon früher
Nee, natürlich nicht, sonst würds ja auch nicht funktionieren Aber in der iostream.h ist cout halt als std::cout definiert. Ansonsten gibt es da keine Unterschiede. Die iostream.h inkludiert die iostream. Nur ist die .h als veraltet markiert und beim kompilieren wird eine Warnung ausgegeben. Die kann man aber auch ignorieren...tylerD hat geschrieben:iostream und iostream.h sind nicht das selbe.
tylerD hat geschrieben:Der gcc hält sich nur pingeliger an den Standard (was auch gut ist).
Du meinst sicherlich gcc ab Version 3.0. Ob das gut ist oder nicht, weiß ich nicht. Es kommt wohl nicht so häufig vor das man sich eine eigene cout Methode schreibt...
cu
Nein, kann man nicht. Dieses Verhalten ist nämlich keineswegs vom Standard definiert. Im Sinne der Portierbarkeit (sowohl Plattform als auch Compiler) sollte man diese Warnung tunlichst nicht ignorieren. Der g++ mag ja (in der jetztigen Version) iostream.h so wie von Dir beschrieben implementieren. Bei anderen Compilern kann die iostream.h aber auch eine veraltete Version enthalten oder auch gar nicht vorhanden sein. Auch ist die Existenz der iostream.h (wie auch aller anderen .h C++-Stdlib-Header) keineswegs für zukünftige g++ Versionen garantiert,jack herer hat geschrieben:Nee, natürlich nicht, sonst würds ja auch nicht funktionieren Aber in der iostream.h ist cout halt als std::cout definiert. Ansonsten gibt es da keine Unterschiede. Die iostream.h inkludiert die iostream. Nur ist die .h als veraltet markiert und beim kompilieren wird eine Warnung ausgegeben. Die kann man aber auch ignorieren...tylerD hat geschrieben:iostream und iostream.h sind nicht das selbe.
cout ist keine Methode, sondern ein globales Objekt. Und Namespaces sind durchaus sinnvoll, auch wenn Du das anders zu sehen scheinst.jack herer hat geschrieben:tylerD hat geschrieben:Der gcc hält sich nur pingeliger an den Standard (was auch gut ist).
Du meinst sicherlich gcc ab Version 3.0. Ob das gut ist oder nicht, weiß ich nicht. Es kommt wohl nicht so häufig vor das man sich eine eigene cout Methode schreibt...
Oh mann, natürlich ist es wichtig, daß sich der aktuelle GCC genau an den Standard hält. Nur durch Einhalten von Standard kannst Du diverse Programme und Bibliotheken überhaupt auf andere Plattformen und Systeme portieren. Ich kann da Spiffi nur zustimmen.jack herer hat geschrieben:tylerD hat geschrieben:Der gcc hält sich nur pingeliger an den Standard (was auch gut ist).
Du meinst sicherlich gcc ab Version 3.0. Ob das gut ist oder nicht, weiß ich nicht. Es kommt wohl nicht so häufig vor das man sich eine eigene cout Methode schreibt...
Es soll auch Leute geben, die jegliche Compilerwarnungen ignorieren -- und sich hinterher über diverse Bugs wundern. Mich wundert da ehrlich gesagt dann gar nix....
cheers,
Jochen
___________________________________________________
Testing can prove the presence of bugs, but not their absence. -- Dijkstra
Jochen
___________________________________________________
Testing can prove the presence of bugs, but not their absence. -- Dijkstra
- jack herer
- Beiträge: 94
- Registriert: 28.07.2003 19:48:17
Stimmt, aber hier gings ja nur darum einmal Hallo Welt auszugeben und da ist diese Warnung wohl kein Weltuntergang...spiffi hat geschrieben: Nein, kann man nicht. Dieses Verhalten ist nämlich keineswegs vom Standard definiert. Im Sinne der Portierbarkeit (sowohl Plattform als auch Compiler) sollte man diese Warnung tunlichst nicht ignorieren. Der g++ mag ja (in der jetztigen Version) iostream.h so wie von Dir beschrieben implementieren. Bei anderen Compilern kann die iostream.h aber auch eine veraltete Version enthalten oder auch gar nicht vorhanden sein. Auch ist die Existenz der iostream.h (wie auch aller anderen .h C++-Stdlib-Header) keineswegs für zukünftige g++ Versionen garantiert,
Ok, sorry wegen der Methode. Ich hab ja auch nicht gesagt, daß namespaces nicht sinnvoll sind, nur ob cout jetzt in std untergebracht ist oder nicht, ist mir persönlich ziemlich egal...spiffi hat geschrieben: cout ist keine Methode, sondern ein globales Objekt. Und Namespaces sind durchaus sinnvoll, auch wenn Du das anders zu sehen scheinst.
Wird ja doch noch ein lustiger Sonntag Abend
cu
Gerade Anfänger, welche ja wohl HelloWorld probieren, sollten sowas vermeiden und sich 5 Minuten mehr Zeit nehmen und gleich richtig versuchen zu lernen was hinter den Namespaces steckt. Sauberer Code kommt nicht von ungefähr, und seinen Programmierstill sauber zu halten fällt im täglichen leben schon recht schwer. Vieles wird einfach nur auf die schnelle und huschhusch gemacht. Wenn man dann nicht mal HelloWorld sauber macht, ist das meiner Meinung nach schon recht schlecht.jack herer hat geschrieben: Stimmt, aber hier gings ja nur darum einmal Hallo Welt auszugeben und da ist diese Warnung wohl kein Weltuntergang...
cu