C
-
Paradebeispiel!
äham , ja:
Wie du schon sagtest: man kommt in manchen Situationen nicht um #define rum.
Und was ist wenn man die Sichtbarkeitsgrenzen (absichtlich) umgehen will, oder was ist mit den schönen #define Makros???Oder dein Beispiel mit "#include-guard"...naja...
...super! schon 3 Seiten...dieser Thread wächst wie WASWEIßICH
-
Und was ist wenn man die Sichtbarkeitsgrenzen (absichtlich) umgehen will
Dafür kann man auch const (auf globaler Ebene) verwenden - hat sogar den Vorteil, daß der Compiler verständliche Fehlermeldungen ausspuckt
oder was ist mit den schönen #define Makros???
sagt dir "inline" (komplett: "template<typename T> inline f(T x);") zufällig etwas?
-
CStoll schrieb:
Und was ist wenn man die Sichtbarkeitsgrenzen (absichtlich) umgehen will
Dafür kann man auch const (auf globaler Ebene) verwenden - hat sogar den Vorteil, daß der Compiler verständliche Fehlermeldungen ausspuckt
oder was ist mit den schönen #define Makros???
sagt dir "inline" (komplett: "template<typename T> inline f(T x);") zufällig etwas?
...also auf die vollständigen Fehlermeldungen kann ich sch*iss*n...des mit der Sichtbarkeitsgrenze stimmt auch...geht aber auch mit #define wie mit const wie mit #define wie mit const wie mit #define ...
Und zu: template<typename T> inline f(T x);
Das kenn ich noch garnet. Sowas ist mir neu.
In meinem C++ Buch stand nix davon...sieht aber logisch aus.Das ist wieder Mal typisch: Man kann so gut wie kein Buch kaufen/finden in dem ALLES,also wirklich alles,beschrieben ist. Immer werden irgendwelche Sprachelemente ausgelassen.
zB: Das Bitshiften(also Infos darüber) musste ich mir aus anderen Quellen besorgen. Des mit template<typename T> inline f(T x); ist wirklich nicht schlecht.Also da muss ich dir Recht geben. Aber #define benutz ich trotzdem fröhöich weiter...!
-
Diskussion beendet. Bringt eh nichts.
-
alex89ru schrieb:
Bloß: Wenn jemand versucht irgendwelche (Sprach-)Elemente aus C++ zu verbannen , die in C vorhanden waren und durch neuere in C++ "ersetzt" wurden,dann kotz dass mich an.
Das Problem ist einfach, dass der Präprozessor keine Namensräume kennt, deshalb verwendet man in C++ für Konstanten idR const und nicht #define. Und das hat nichts damit zu tun, dass man alte C Sprachelemente "verbannen" will.
-
alex89ru schrieb:
Bloß: Wenn jemand versucht irgendwelche (Sprach-)Elemente aus C++ zu verbannen , die in C vorhanden waren und durch neuere in C++ "ersetzt" wurden,dann kotz dass mich an.
naja, const ist ganz gut gelungen und man sollte es nehmen.
aber mich kotzt es auch an, wenn gepredigt wird, alles auf eine art zu machen, die in c++ geht und in c nicht. das artet dann in lustige sachen aus wie
char ersterBuchstabe(string const& str){ return str[0]; } //nebst cout<<ersterBuchstabe("hallo")<<endl;
wobei man durchaus nullterminierte strings nehmen könnte. mindestens eine zusätzliche überlaudng mit
char ersterBuchstabe(char const* str){ return str[0]; }
sollte her.
wenn man das nicht macht, ist man auf einmal bei den leuten, wo c++ langsamer als c ist, weil, weil...
man kann in jeder sprache unfug treiben, aber in c++ muß man aufpassen, keinen zu treiben.
-
groovemaster schrieb:
Das Problem ist einfach, dass der Präprozessor keine Namensräume kennt, deshalb verwendet man in C++ für Konstanten idR const und nicht #define. Und das hat nichts damit zu tun, dass man alte C Sprachelemente "verbannen" will.
äh
wo ist denn hier überhaupt das problem #define <-> const
geht doch beides sowohl in c als auch in c+++, benutze bei c auch const
-
groovemaster schrieb:
Das Problem ist einfach, dass der Präprozessor keine Namensräume kennt, deshalb verwendet man in C++ für Konstanten idR const und nicht #define. Und das hat nichts damit zu tun, dass man alte C Sprachelemente "verbannen" will.
...dass mit #define und const war nur ein BEISPIEL!
Jap , im übrigen schließe ich mich volkards Meinung voll und ganz an!!!
Und wie schon gesagt: Ich mag C ___UND___ C++!!!
Ich will hier C++ nicht schlecht darstellen...Un noch was an den UNREGISTRIERTEN "C-Moderator": Von mir aus kann diese Diskusion so weiter gehen ... mir gefällts ... hier kommen endlich "wahre" Dinge ans Licht
-
@icepackker: In C sind const und #define leider nicht austauschbar - z.B. folgender Code ist völlig legal in C++, aber verboten für C:
const int count=100; char array[count];
(um das selbe Array in C zu deklarieren, führt kein Weg an "#define count 100" vorbei)
@alex: Klar hat auch C seine Vorteile (und ich hab' auch nichts gegen C), aber wenn etwas mit C++ leichter und sicherer zu bewerkstelligen ist, sollte man sich nicht auf den "C-Weg" festlegen
-
Ja , stimmt schon irgendwie , aber alte Gewohnheiten wird man bekanntlich nur sehr schwer los (vielleicht lieft es ja daran , dass ich es nicht loswerden will), naja jedenfalls benutze ich fröhlich #define weiter(aus kompatibilitätsgründen zu C aus welchem Grund auch immer) und wenn jemand const benutzt habe ich auch bichts dagegen,
Mir geht es nur darum , dass eine Sprache die andere nicht verbannt!
Naja , schönene Tag noch und viel Spaß beim coden mit const ___UND #define!!!
-
alex89ru schrieb:
Ja , stimmt schon irgendwie , aber alte Gewohnheiten wird man bekanntlich nur sehr schwer los (vielleicht lieft es ja daran , dass ich es nicht loswerden will), naja jedenfalls benutze ich fröhlich #define weiter(aus kompatibilitätsgründen zu C aus welchem Grund auch immer) und wenn jemand const benutzt habe ich auch bichts dagegen,
Mir geht es nur darum , dass eine Sprache die andere nicht verbannt!
Naja , schönene Tag noch und viel Spaß beim coden mit const ___UND #define!!!
das ist jetzt aber ein böswilliges ablehnen jeglicher einsicht zum zwecke des trollens.
-
Ich sehe garnichts ein...da es nichts einzusehen gibt!!!
Sei tollerant gegenüber C und C++!!!! Nicht nur C++.
-
alex89ru schrieb:
Ich sehe garnichts ein...da es nichts einzusehen gibt!!!
Sei tollerant gegenüber C und C++!!!! Nicht nur C++.Wieso sollten wir? Wir sind auch gegenüber QBasic nicht tolerant
-
alex89ru schrieb:
Ich sehe garnichts ein...da es nichts einzusehen gibt!!!
Sei tollerant gegenüber C und C++!!!! Nicht nur C++.nimm in C #define und in C++ const. es sind verschiedene sprachen. machst ja auch nicht
#define BEGIN { #define END }
um mit pascal kompatiben zu sein oder
#define print cout<<
um wie imn basic
print "hallo, welt";
schreiben zu können.
-
Das liegt vielleicht daran , da ich NICHT tolerant gegenüber Basic , Qbasic , VisualBasic und sonstigem Scheiss bin.
Un im Grunde genommen ist es doch SCHEISSEGAL ob man #define oder oonst nimmt!
Im Endeffekt kommt eh das gleiche raus... gleicher code.!!!
zugegeben : So tolerant gegenüber anderen Sprachen bin ich auch net!!!!!!!!!!!! :p
Aber C und C++ sind miteinander verwandt.
So
-
Un im Grunde genommen ist es doch SCHEISSEGAL ob man #define oder oonst nimmt!Im Endeffekt kommt eh das gleiche raus... gleicher code.!!!
Falsch, da der Präprozessor dein #define rausfiltert (und jedem Debugger unbekannt ist), wird ein anderer Code erzeugt, als wenn du const verwendest.
-
Tja GPC: Hab gerade etwas ausprobiert(mit g++).
Einmal mit #define und einmal mit const und es ist der gleiche assembler code rausgekommen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
(habs mit g++ -o someasmcode.s -S test.c "compiliert")1:
const int B = 0xff; int main (void) { char buf[B]; }
... sit identisch mit
[/cpp]
#define B 0xff;int main (void)
{
char buf[B];
}
[cpp]Tja , GPC: identischer code. const hat nur den vorteil wegen der compiler meldungen.
-
Probier das mal das unten aus, und sag mir dann ob immer noch der gleiche asm-Code rauskommt. Vorher hat der Compiler bei deinem Beispiel wahrscheinlich B als unused erkannt und wegoptimiert.
#define SIZE 5 int main(int argc, char **argv) { int arr[SIZE]; cout<<SIZE<<'\n'; return 0; };
const size_t SIZE = 5; int main(int argc, char **argv) { int arr[SIZE]; cout<<SIZE<<'\n'; return 0; };
-
Ich habe deinen code ausprobiert(asm-code davon angeschaut) und:
Nee , da gibt es ABSOLUT KEINE UNTERSCHIEDE!!!!
Ich bin noch extra Zeile für Zeile durchgegangen , doch der code war identisch!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
icepacker schrieb:
äh
wo ist denn hier überhaupt das problem #define <-> const
geht doch beides sowohl in c als auch in c+++Nun c+++ kenn ich leider nicht (sollte ich mir darüber Sorgen machen
) und es ging bei der Aussage auch nicht um C. In C kannst du von mir aus #define oder const benutzen wie du willst, ist eigentlich relativ egal.
Versuche aber mal folgenden Code mit einem standardkonformen C++ Compiler deiner Wahl zu übersetzen:namespace A { const int C = 1; #define D 1 } namespace B { const int C = 2; #define D 2 }
Du wirst wahrscheinlich recht schnell merken, dass sich der Code nicht übersetzen lässt. Das liegt aber nicht am const, sondern am #define.