Schrift
[thread]1139[/thread]

g++ != C++ Standard ?



<< |< 1 2 >| >> 17 Einträge, 2 Seiten
J-jayz-Z
 2006-01-09 11:20
#11317 #11317
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi,
mir ist etwas aufgefallen, was den C++ Standard und g++ angeht.
Stroustrup schreibt ja in seinem Buch "Die C++ Programmiersprache", das es dem Standard entspricht.
Mir sind 2 Dinge in der neuesten Auflage aufgefallen, die g++ nicht übersetzt.
1.) Mit struct selbst erstellte Datentypen in templates funktionieren nicht

Code: (dl )
1
2
3
4
5
6
 
struct foo {
int bar,
int blubb
};
vector<foo> lala(2);


Das will er nicht übersetzen. Das ist nicht nur bei vector so, auch bei anderen templates.

2.) Globalisiertes Ansprechen von Variablen mit ::

Code: (dl )
1
2
3
4
5
int x = 4;
{
int x = 3;
std::cout << ::x << x << std::endl;
}



Was haltet Ihr davon ? ? ?
Die Fehlermeldungen von g++ habe ich leider nicht parat, da ich zuhause Momentan kein Internet habe ... :(
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
esskar
 2006-01-09 11:27
#11318 #11318
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
ja, das kann schon sein.
es werden viele hier nicht hören wollen, aber der cl Compiler von M$ ist zu ca. 99,9% C++ Standard kompatibel. Man kann sagen was man will, aber in Sachen Kompiler ist M$ echt weit vorne und hält sich auch an die Regeln.

zu deinem Beispiel:
es muss
Code: (dl )
1
2
3
4
struct foo {
int bar;
int blubb;
};

heißen. War bei dir nur ein Vertipper, oder?
Seltsam find ich das Verhalten aber schon. Bist du dir sicher?

ABer an sich funzen deine Snippets 100% mit dem cl!
J-jayz-Z
 2006-01-09 11:45
#11319 #11319
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
jo, war nur ein vertipper im struct, passiert auf die schnelle ^^
Ja, damit bin ich mir sicher. Das selbe verhalten lässt sich aber nur auf struct s begränzen. Klassen gehen wieder. Zum Glück ;)
Das mit ::x wundert mich am meisten.
Ich gehe einfach mal von aus, das Stroustrup weiß, was er da schreibt, also denke ich auch mal, das es an g++ liegt. Also unter Windows geht es ?\n\n

<!--EDIT|J-jayz-Z|1136799960-->
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
esskar
 2006-01-09 12:22
#11320 #11320
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
mit dem cl compiler, ja. Mit g++ unter windows gehts natürlich auch nicht! :p
murphy
 2006-01-09 14:38
#11321 #11321
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Also ich weiß nicht, was ihr für Probleme habt. Bei mir geht das, wenn man alle Flüchtigkeitsfehler in deinem obigen Code korrigiert:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
#include <vector>

using namespace std;

struct foo {
 int bar;
 int blubb;
};

vector<foo> lala(2);

kompiliert einwandfrei und ebenso
Code: (dl )
1
2
3
4
5
6
7
8
#include <iostream>

int x = 4;

int main(void) {
int x = 3;
std::cout << ::x << x << std::endl;
}


Letzteres liefert beim Ausführen auch die richtige Ausgabe ;)

Getestet mit
Code: (dl )
1
2
3
$ gcc --version
powerpc-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5247)
[...]


edit: mit
Code: (dl )
1
2
3
$ gcc --version
gcc (GCC) 3.3.4 (pre 3.3.5 20040809)
[...]

gibt's auch keine Probleme.\n\n

<!--EDIT|murphy|1136810637-->
When C++ is your hammer, every problem looks like your thumb.
esskar
 2006-01-09 14:47
#11322 #11322
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
ich hab es nicht g++ probiert.
weiß aber aus erfahrung, dass es unter cl keine probleme gibt.
murphy
 2006-01-09 17:41
#11323 #11323
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Da du sagtest, mit g++ unter Windows funktionierten die Snippets natürlich auch nicht, dachte ich eigentlich, du hättest das getestet...

Ich kann dir allerdings nicht zustimmen, dass der MS Compiler wesentlich besser als der GCC ist. Aus meiner Erfahrung bin ich eher versucht zu sagen, dass es nicht einen einzigen guten C++ Compiler gibt, nur einige anständige C Compiler. Daher programmiere ich auch seit geraumer Zeit recht ungern C++ -- irgendwie schaffe ich es bei jedem einzelnen C++ Programm, das ich schreibe und das nicht völlig trivial ist, den Sprachstandard so auszunutzen, dass ich auf irgendwelche fiesen Compilerbugs stoße. Wenn ich dann für alles Workarounds gefunden habe, stelle ich meistens fest, dass ich das Programm im Endeffekt eleganter in C hätte schreiben können...
When C++ is your hammer, every problem looks like your thumb.
ptk
 2006-01-10 00:22
#11324 #11324
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Das schafft sogar der g++ 2.95.4 :-)
J-jayz-Z
 2006-01-11 10:29
#11325 #11325
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Also bei mir geht es nicht:
Code: (dl )
1
2
3
4
ingo dev # g++ -o foo foo.cpp
/usr/lib/gcc-lib/i486-linux/3.3.5/../../../crt1.o(.text+0x18): In function `_start':
../sysdeps/i386/elf/start.S:98: undefined reference to `main'
collect2: ld returned 1 exit status

Und was die Version angeht:
Code: (dl )
1
2
3
4
5
ingo dev # g++ --version
g++ (GCC) 3.3.5 (Debian 1:3.3.5-13)
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
murphy
 2006-01-11 11:05
#11326 #11326
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Offensichtlich kompiliert es doch einwandfrei! Dass es sich nicht linken lässt, weil die main Funktion fehlt, ist ein völlig anderes Problem.
When C++ is your hammer, every problem looks like your thumb.
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2006-01-09 11:20.