nichtmal Hallo-welt?!

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Desian
Beiträge: 35
Registriert: 02.09.2003 13:34:18
Kontaktdaten:

nichtmal Hallo-welt?!

Beitrag von Desian » 18.09.2003 11:11:20

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

Jens Oeser
Beiträge: 96
Registriert: 17.07.2002 17:04:22
Lizenz eigener Beiträge: GNU Free Documentation License

Beitrag von Jens Oeser » 18.09.2003 11:27:47

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.

Benutzeravatar
spiffi
Beiträge: 1128
Registriert: 09.08.2003 19:02:27

Beitrag von spiffi » 18.09.2003 11:56:32

Jens Oeser hat geschrieben:ich habe das mal kurz nachvollzogen und keine Probleme gehabt, das Beispiel zu übersetzen.
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 ein

Code: Alles auswählen

using namespace std;
hinzufügen, oder den Namespace-Qualifier vor den Aufruf von cout setzen:

Code: Alles auswählen

std::cout << "Hallo!\n"; 

Jens Oeser
Beiträge: 96
Registriert: 17.07.2002 17:04:22
Lizenz eigener Beiträge: GNU Free Documentation License

Beitrag von Jens Oeser » 18.09.2003 12:15:40

spiffi hat geschrieben: Hm, dann ist der Compiler aber nicht so ganz C++-standardkonform.
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.

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.

Benutzeravatar
Desian
Beiträge: 35
Registriert: 02.09.2003 13:34:18
Kontaktdaten:

Beitrag von Desian » 19.09.2003 08:59:16

Danke Leuts!
Jetzt tuts.

cu Desian

Benutzeravatar
jack herer
Beiträge: 94
Registriert: 28.07.2003 19:48:17

Beitrag von jack herer » 20.09.2003 22:31:42

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.
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!

tylerD
Beiträge: 4068
Registriert: 10.07.2002 17:34:13
Wohnort: Halle/Saale
Kontaktdaten:

Beitrag von tylerD » 21.09.2003 00:10:55

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!
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.

cu

Benutzeravatar
jack herer
Beiträge: 94
Registriert: 28.07.2003 19:48:17

Beitrag von jack herer » 21.09.2003 18:52:22

tylerD hat geschrieben:Namespaces gabes schon früher
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:iostream und iostream.h sind nicht das selbe.
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: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

Benutzeravatar
spiffi
Beiträge: 1128
Registriert: 09.08.2003 19:02:27

Beitrag von spiffi » 21.09.2003 19:39:39

jack herer hat geschrieben:
tylerD hat geschrieben:iostream und iostream.h sind nicht das selbe.
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...
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:
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...
cout ist keine Methode, sondern ein globales Objekt. Und Namespaces sind durchaus sinnvoll, auch wenn Du das anders zu sehen scheinst.

Benutzeravatar
jogix
Beiträge: 776
Registriert: 05.10.2002 20:08:16
Wohnort: Lampertheim
Kontaktdaten:

Beitrag von jogix » 21.09.2003 20:06:58

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.

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

Benutzeravatar
jack herer
Beiträge: 94
Registriert: 28.07.2003 19:48:17

Beitrag von jack herer » 21.09.2003 20:13:10

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,
Stimmt, aber hier gings ja nur darum einmal Hallo Welt auszugeben und da ist diese Warnung wohl kein Weltuntergang...

spiffi hat geschrieben: cout ist keine Methode, sondern ein globales Objekt. Und Namespaces sind durchaus sinnvoll, auch wenn Du das anders zu sehen scheinst.
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...

Wird ja doch noch ein lustiger Sonntag Abend :-)

cu

tylerD
Beiträge: 4068
Registriert: 10.07.2002 17:34:13
Wohnort: Halle/Saale
Kontaktdaten:

Beitrag von tylerD » 22.09.2003 00:23:28

jack herer hat geschrieben: Stimmt, aber hier gings ja nur darum einmal Hallo Welt auszugeben und da ist diese Warnung wohl kein Weltuntergang...
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.

cu

Antworten