 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Markus Krebl Guest
|
Posted: Fri Oct 22, 2004 11:55 am Post subject: Kompilieren mit gcc (Windows) |
|
|
Hallo,
fang gerade mit c++ an und verwende den GNU - C++ Compiler, der bei der
Entwicklungsumgebung DEVCPP 5 dabei ist.
Habe folgendes Programm eingegeben :
#include <iostream.h>
int main ()
{
cout << "Hello World !" << endl ;
return (0) ;
}
und starte den Compiler dann mit :
"C:devcppbingcc.exe" -I c:devcppinclude -Lc:devcpplib -otest1.exe
-Wall test1.cpp
Dann krieg ich folgende Fehlermeldungen :
In file included from
C:/devcpp/include/c++/3.3.1/backward/iostream.h:31,
from test1.cpp:1:
C:/devcpp/include/c++/3.3.1/backward/backward_warning.h:32:2: warning:
#warning This file includes at least one deprecated or antiquated
header. Please consider using one of the 32 headers found in section
17.4.1.2 of the C++ standard. Examples include substituting the
header for the <X.h> header for C++ includes, or <sstream> instead of
the deprecated header <strstream.h>. To disable this warning use
-Wno-deprecated.
C:WINDOWSTEMP/cciTUggb.o(.text+0x37):test1.cpp: undefined reference to
`std::cout'
C:WINDOWSTEMP/cciTUggb.o(.text+0x3c):test1.cpp: undefined reference to
`std::basic_ostream<char, std::char_traits& std::operator<<
(std::basic_ostream<char,
std::char_traits&, char const*)'
C:WINDOWSTEMP/cciTUggb.o(.text+0x44):test1.cpp: undefined reference to
`std::basic_ostream<char, std::char_traits& std::endl<char,
std::char_traits(std::basic_ostream<char, std::char_traits
| Quote: | &)'
C:WINDOWSTEMP/cciTUggb.o(.text+0x4c):test1.cpp: undefined reference to |
`std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
C:WINDOWSTEMP/cciTUggb.o(.text+0x75):test1.cpp: undefined reference to
`std::ios_base::Init::Init()'
C:WINDOWSTEMP/cciTUggb.o(.text+0x90):test1.cpp: undefined reference to
`std::ios_base::Init::~Init()'
Terminated with exit code 1
Was läuft hier falsch ?
lg, Markus
--
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 |
|
 |
Andreas Volz Guest
|
Posted: Sat Oct 23, 2004 7:23 pm Post subject: Re: Kompilieren mit gcc (Windows) |
|
|
Am Fri, 22 Oct 2004 13:55:41 +0200 schrieb Markus Krebl:
| Quote: | fang gerade mit c++ an und verwende den GNU - C++ Compiler, der bei
der Entwicklungsumgebung DEVCPP 5 dabei ist.
Habe folgendes Programm eingegeben :
#include <iostream.h
int main ()
{
cout << "Hello World !" << endl ;
return (0) ;
}
und starte den Compiler dann mit :
"C:devcppbingcc.exe" -I c:devcppinclude -Lc:devcpplib
-otest1.exe
-Wall test1.cpp
Dann krieg ich folgende Fehlermeldungen :
|
#include
int main ()
{
std::cout << "Hello World !" << std::endl ;
return (0) ;
}
....sollte gehen. Am besten du versuchst dir entweder ein aktuelleres
Buch oder eine aktuellere Online-Referenz für C++ zu besorgen. So wie
von dir oben geschrieben ist es nicht mehr die aktuelle Schreibweise.
Gruß
Andreas
--
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: Sat Oct 23, 2004 7:25 pm Post subject: Re: Kompilieren mit gcc (Windows) |
|
|
"Markus Krebl" <markus.krebl (AT) gmx (DOT) net> schrieb:
| Quote: | #include <iostream.h
int main ()
{
cout << "Hello World !" << endl ;
return (0) ;
}
|
Das Programm ist im Prinzip "richtig", aber veraltet. Seit ungefähr
6 Jahren schreibt man das so:
#include
int main()
{
std::cout << "Hello, world!n";
}
(Pedanten würden noch »#include
noch »return 0;«)
| Quote: | "C:devcppbingcc.exe" -I c:devcppinclude -Lc:devcpplib -otest1.exe
-Wall test1.cpp
|
Benutze immer "g++"! (Wenn Du Standard-C++ lernen willst, könnten die
Optionen "-ansi -pedantic" hilfreich sein, evtl. noch "-W".)
| Quote: | Dann krieg ich folgende Fehlermeldungen :
In file included from
C:/devcpp/include/c++/3.3.1/backward/iostream.h:31,
from test1.cpp:1:
C:/devcpp/include/c++/3.3.1/backward/backward_warning.h:32:2: warning:
#warning This file includes at least one deprecated or antiquated
header. Please consider using one of the 32 headers found in section
17.4.1.2 of the C++ standard. Examples include substituting the <X
header for the
the deprecated header <strstream.h>. To disable this warning use
-Wno-deprecated.
|
Du kannst kein Englisch? Babelfish hilt dabei auch nicht viel ... es heißt
ungefähr, daß Dein Code veraltet ist und Du lieber modernes C++ benutzen
sollst (siehe oben); jedoch ist das nur eine Warnung, kein Fehler. Die
wirklichen Fehler sind durch den falschen Compileraufruf verursacht.
--
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 Krebl Guest
|
Posted: Sat Oct 23, 2004 7:56 pm Post subject: Re: Kompilieren mit gcc (Windows) |
|
|
Stefan Ram wrote:
| Quote: | Eine mit der aktuellen C++-Norm verträgliche
C++-Übersetzungseinheit ist:
#include <iostream> // ::std::cout
#include <ostream> //
int main(){ ::std::cout << "Hallo!" << 'n'; }
|
Hallo !
Ich hab's jetzt so geschrieben :
#include
using namespace std ;
int main ()
{
cout << "Hallo !" << endl ;
return (0) ;
}
Hab den Eindruck daß sieht schöner aus als wenn man dieses ::std::cout
schreiben muß.
Noch dazu wird es jetzt auch anstandslos kompiliert :-)
lg, Markus
--
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 Kossmann Guest
|
Posted: Sat Oct 23, 2004 8:11 pm Post subject: Re: Kompilieren mit gcc (Windows) |
|
|
Markus Krebl wrote:
| Quote: | Hallo,
fang gerade mit c++ an und verwende den GNU - C++ Compiler, der bei
der Entwicklungsumgebung DEVCPP 5 dabei ist.
Habe folgendes Programm eingegeben :
#include <iostream.h
int main ()
{
cout << "Hello World !" << endl ;
return (0) ;
}
Hier verwendest du nicht aktuelles Standard-C++, sondern einen |
veralteten C++ Dialekt. Das verursacht u.a. die Warnung bezüglich der
Headerfiles
Richtig wäre :
#include
int main ()
{
std::cout << "Hello World !" << endl ;
return (0) ;
}
| Quote: | und starte den Compiler dann mit :
"C:devcppbingcc.exe" -I c:devcppinclude -Lc:devcpplib
-otest1.exe -Wall test1.cpp
|
Und hier benutzt du gcc.exe, das C-Compiler Frontend und nicht g++.exe,
das C++ Frontend. Das erkennt zwar den C++-Code anhand der .cpp
Extension und startet das C++-Backend. Aber die C++-Standardbibliothek
wird nicht automatisch mitgelinkt und es gibt undefined references zu
deren Funktionen.
--
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 Krebl Guest
|
Posted: Sat Oct 23, 2004 10:03 pm Post subject: Re: Kompilieren mit gcc (Windows) |
|
|
Stefan Ram wrote:
| Quote: |
Markus Krebl <markus.krebl (AT) gmx (DOT) net> writes:
#include
using namespace std ;
int main ()
{
cout << "Hallo !" << endl ;
return (0) ;
}
Hab den Eindruck daß sieht schöner aus als wenn man dieses
::std::cout schreiben muß.
Dann ist es allerdings nicht ganz klar, warum Du
das überflüssige return schreibst, noch dazu mit
überflüssigen Klammern.
|
Wenn ich main als int main () deklariere, dann muß ich ja zwangsläufig
einen Integer-Wert zurückliefern oder ? Ansonsten bekomm ich ja immer
einen Compilerfehler.
lg, Markus
--
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 |
|
 |
Rolf Magnus Guest
|
Posted: Sat Oct 23, 2004 11:06 pm Post subject: Re: Kompilieren mit gcc (Windows) |
|
|
Markus Krebl wrote:
| Quote: | Hab den Eindruck daß sieht schöner aus als wenn man dieses
::std::cout schreiben muß.
Dann ist es allerdings nicht ganz klar, warum Du
das überflüssige return schreibst, noch dazu mit
überflüssigen Klammern.
Wenn ich main als int main () deklariere, dann muß ich ja zwangsläufig
einen Integer-Wert zurückliefern oder ?
|
Nein. Ein "Herausfallen" aus main() ohne return entspricht einem return 0.
| Quote: | Ansonsten bekomm ich ja immer einen Compilerfehler.
|
Das glaube ich nicht.
--
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 |
|
 |
Stefan Reuther Guest
|
Posted: Sun Oct 24, 2004 9:23 am Post subject: Re: Kompilieren mit gcc (Windows) |
|
|
Markus Krebl wrote:
| Quote: | Stefan Ram wrote:
Markus Krebl <markus.krebl (AT) gmx (DOT) net> writes:
#include
using namespace std ;
int main ()
{
cout << "Hallo !" << endl ;
return (0) ;
}
Hab den Eindruck daß sieht schöner aus als wenn man dieses
::std::cout schreiben muß.
|
Du kannst übrigens auch einfach nur 'std::cout' schreiben. Ich kenne
niemanden weiter, der '::std' schreiben würde. Und zumindest in
Headerfiles ist die Verwendung von qualifizierten Namen ein Muss. In
..cpp-Dateien darfst du gerne 'using namespace std' verwenden, aber in
Header solltest du das vermeiden.
| Quote: | Dann ist es allerdings nicht ganz klar, warum Du
das überflüssige return schreibst, noch dazu mit
überflüssigen Klammern.
Wenn ich main als int main () deklariere, dann muß ich ja zwangsläufig
einen Integer-Wert zurückliefern oder ? Ansonsten bekomm ich ja immer
einen Compilerfehler.
|
Jede int-Funktion sollte mittels 'return' einen Wert zurückliefern.
'main' ist eine Ausnahme, hier darfst du das 'return' weglassen. Aber
nur weil du es darfst, musst du es noch lange nicht machen. Zum einen
gibt es Compiler, die das nicht auf die Reihe bekommen. Zum anderen ist
es meiner Meinung nach einfach guter Stil, bei nichttrivialen Programmen
auch implizite Dinge aufzuschreiben - wie eben das implizite 'return 0'
in main. Es ist niemals falsch, das return zu schreiben, allerdings ist
es falsch, in einer anderen int-Funktion das return wegzulassen.
Stefan
--
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 |
|
 |
Nicolas Pavlidis Guest
|
Posted: Sun Oct 24, 2004 10:14 am Post subject: Re: Kompilieren mit gcc (Windows) |
|
|
Markus Krebl <markus.krebl (AT) gmx (DOT) net> writes:
Hi!
| Quote: | Ich hab's jetzt so geschrieben :
#include
using namespace std ;
|
Auszer bei kleinen Programmen, wie diesem, habe ich mir angewoehnt nicht
ganze Namespaces ueber using einzubinden, sondernnur die Teile die ich
wirklich brauche.
Es sollten zwar keine Nameclashes mit namespace std passieren, aber wenn
man mal eingene namespaces in seinem Projekt hat kann es schon zu
Problemem kommen.
also:
using std::cout;
using std::endl;
LG
Nicolas
--
| Quote: | Nicolas Pavlidis | Elvis Presly: | |__ |
Student of SE & KM | "Into the goto" | |__| |
[email]pavnic (AT) sbox (DOT) tugraz.at[/email] | ICQ #320057056 | |
-------------------University of Technology, Graz----------------|
|
--
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 |
|
 |
Nicolas Pavlidis Guest
|
Posted: Sun Oct 24, 2004 10:21 am Post subject: Re: Kompilieren mit gcc (Windows) |
|
|
[email]ram (AT) zedat (DOT) fu-berlin.de[/email] (Stefan Ram) writes:
| Quote: | Markus Krebl <markus.krebl (AT) gmx (DOT) net> writes:
#include
using namespace std ;
int main ()
{
cout << "Hallo !" << endl ;
return (0) ;
}
Hab den Eindruck daß sieht schöner aus als wenn man dieses
::std::cout schreiben muß.
Dann ist es allerdings nicht ganz klar, warum Du
das überflüssige return schreibst, noch dazu mit
überflüssigen Klammern.
|
Ich denke mir, das das gewohnheitssache ist, aber aus Knsistenzgruenden
wuerde ich (und tue es auch) das return - Stetment auch am Ende von
main() schreiben, mit Klammern . Aber das ist eben Gewohnheitssache.
LG
Nicolas
--
| Quote: | Nicolas Pavlidis | Elvis Presly: | |__ |
Student of SE & KM | "Into the goto" | |__| |
[email]pavnic (AT) sbox (DOT) tugraz.at[/email] | ICQ #320057056 | |
-------------------University of Technology, Graz----------------|
|
--
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: Sun Oct 24, 2004 12:36 pm Post subject: Re: Kompilieren mit gcc (Windows) |
|
|
"Stefan Ram" <ram (AT) zedat (DOT) fu-berlin.de> schrieb:
| Quote: | Ich gehe eben nach folgender Regel vor:
Wenn zwei Schreibweisen einer formalen Sprache für den
angestrebten Zweck gleichwertig sind und es sonst kein
stärkeres Kriterium gibt, dann wähle ich die kürzere.
|
Tust Du nicht. Sonst würdest Du »std::« statt »::std::« schreiben,
weil es in den hier betrachteten Fällen gleichwerig ist.
--
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 |
|
 |
Rolf Magnus Guest
|
Posted: Sun Oct 24, 2004 1:54 pm Post subject: Re: Kompilieren mit gcc (Windows) |
|
|
Stefan Ram wrote:
| Quote: | "Markus Schaaf" <markus (AT) sags-per-mail (DOT) de> writes:
Wenn zwei Schreibweisen einer formalen Sprache für den
angestrebten Zweck gleichwertig sind und es sonst kein
stärkeres Kriterium gibt, dann wähle ich die kürzere.
Tust Du nicht. Sonst würdest Du »std::« statt »::std::«
schreiben, weil es in den hier betrachteten Fällen gleichwerig
ist.
Wenn ich das Verzeichnis "/etc" bezeichnen will, dann verwende
ich "/etc". In einigen Fällen, würde "etc" zwar dasselbe
Verzeichnis bezeichnen - aber die Bedeutung von "etc" hängt
vom Kontext (dem aktuellen Verzeichnis) ab: Während "etc" ein
relativer Pfad ist, ist "/etc" ein absoluter Pfad.
Begrifflich ist "/etc" eindeutig und "etc" mehrdeutig.
|
Im Beispiel waren wir allerdings im globalen Namespace, schließlich war es
in main(). Da hat std und ::std immer dieselbe Bedeutung, ganz genauso wie
ein fehlendes return-Statement und ein return 0; dieselbe Bedeutung haben.
| Quote: | Es ist diese begriffliche Eindeutigkeit, die mich veranlasst,
"::std" zu schreiben, wenn ich "::std" meine; was ja auch die
Autoren von ISO/IEC 14882:1998 (E) in zwei Fällen getan haben.
|
Und in wie vielen Fällen haben sie es nicht getan?
| Quote: | Die so geschriebenen Blöcke können später auch unverändert in
Umgebungen verwendet werden, in denen "std" einen anderen
Namensraum bezeichnet als "::std".
|
Und man könnte sie auch in einer anderen Funktion verwenden, die von main()
aus aufgerufen wird. Da darf das return dann auch nicht mehr fehlen.
| Quote: | Diese Robustheit ist hier ein stärkeres Kriterium als die Kürze,
|
Das ist wohl Ansichtssache.
| Quote: | anders als etwa bei den überflüssigen Klammern in
"0 + 1 +( 2 * 3 )+ 3 + 4 ", die in /jedem/ Kontext
überflüssig sind.
|
Für den Compiler ja, aber für den Leser evtl. nicht. Für den Compiler sind
auch Zeilenumbrüche überflüssig, genauso wie ein großer Teil des restlichen
Whitespace in typischem Quellcode. Trotzdem lasse ich sie nicht weg, da sie
der Lesbarkeit dienen.
--
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 |
|
 |
Andre Poenitz Guest
|
Posted: Sun Oct 24, 2004 7:20 pm Post subject: Re: Kompilieren mit gcc (Windows) |
|
|
Rolf Magnus <ramagnus (AT) t-online (DOT) de> wrote:
| Quote: | Wenn ich main als int main () deklariere, dann muß ich ja zwangsläufig
einen Integer-Wert zurückliefern oder ?
Nein. Ein "Herausfallen" aus main() ohne return entspricht einem return 0.
|
Ich weiss, dass es Rolf weiss, aber es kommt hier m.E. nicht so klar
raus, obwohl nichts falsches da steht: Diese Regel gibt es _nur_ fuer
die Funktion main.
Andre'
--
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 |
|
 |
Georg Maaß Guest
|
Posted: Sun Oct 31, 2004 8:03 pm Post subject: Re: Kompilieren mit gcc (Windows) |
|
|
Stefan Reuther wrote:
| Quote: | allerdings ist
es falsch, in einer anderen int-Funktion das return wegzulassen.
|
und führt trotzdem nicht zwingend zur Compiler-Fehlermeldung, sondern
unter Umständen zur Laufzeitüberraschung. Beim alten g++ habe ich schon
solche Überraschungen eelebt, wo einzelne Zweige einer Funktion ein
nacktes return hatten und der Compiler dies nicht beanstandete. Das
Ergebnis war dann ein undefinierter (also zufälliger) Rückgabewert. Das
Peogramm stürze nicht ab, machte aber vom Zufall geführt unter Umständen
etwas völlig anderes als gewünscht. Solche Programmierfehler sind ätzend.
--
Georg Maaß - bioshop.de D-76227 Karlsruhe, Westmarkstraße 82
HTML, XML / JavaScript, C++, Java, PHP, VB / CGI, JSP, ASP, ASP.net
- The ultimate DHTML engine: http://gml-modul.sourceforge.net -
http://sourceforge.net/projects/gml-modul
--
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 |
|
 |
Michael Karcher Guest
|
Posted: Fri Nov 05, 2004 5:19 pm Post subject: Re: Kompilieren mit gcc (Windows) |
|
|
Georg Maaß <georg (AT) bioshop (DOT) de> wrote:
| Quote: | Ergebnis war dann ein undefinierter (also zufälliger) Rückgabewert. Das
Peogramm stürze nicht ab, machte aber vom Zufall geführt unter Umständen
etwas völlig anderes als gewünscht. Solche Programmierfehler sind ätzend.
|
Dagegen hilft leider nur ein passend hoher Warninglevel vom gcc. Besonders
kritisch finde ich allerdings, dass ein "hintenrausfallen" aus einer
Funktion selbst dann nur eine (ohne -W natürlich abgeschaltete) Warnung
ergibt, wenn der zurückgegebene Typ nur nichttriviale Konstruktoren hat.
Ausgeführt wird dann nämlich keiner von denen.
Meiner Meinung nach ist das ein Fall von undefined behaviour, den der
Compiler (wenigstens als Warnung, auch ohne -W) fangen sollte, selbst wenn
damit einige Programme, die gültig sind, eine Diagnostic erfordern, wie zum
Beispiel (solange der Kommentar wirklich eingehalten wird):
// Bitte nur mit i=1 oder i=2 aufrufen, sonst knallts.
std::string zahl_zu_wort(int i)
{
if(i == 1)
return "eins";
if(i == 2)
return "zwei";
}
Michael Karcher
--
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
|
|