Frage zu geschweiften Klammern
-
Ich hab grad eben jemandem geholfen seinen Fehler zu finden und bin dabei auf was gestoßen:
Man kann sinnlos geschweifte Klammer ohne If/etc. schreiben und es gibt keine Compiler Fehler/Warnungen. Hab dass ganze nur mit Visual Studio 2008 getestet, liegt dass an dem oder gehört dass zu C++? Wenn dass an C++ liegt, kann mir einer den Sinn erklären?
Bsp.:
int main() { {/*Nichts*/} {cout << "Hallo, ich werde ausgegeben!";} {{ {/*Noch wenniger*/} }} return 0; }
-
Das hat seinen Sinn und zwar geht es hier um einen Gültigkeitsbereich bzw. Sichtbarkeitsbereich:
int main() { int a = 5; { int b = 20; std::cout << b << std::endl; } std::cout << a << " " << b; }So versuchst du das zu kompilieren, bekommst du einen Error. Zwischen { } wurde eine Variable b definiert und diese Variable existiert nur zwischen den beiden { }. Bei dem 2. cout existiert diese Variable bereits nicht mehr und kann nicht ausgegeben werden.
-
Die Klammern definieren lediglich einen Namensraum.
Wenn du also in einem Namensraum nichts anlegst ist das auch kein Fehler.
Alles O.K.
-
int main() { int x; { ifstream in("c:\test.txt"); in>>x; }//weg mit dem eingabestrom cout<<x; }
-
Danke, wieder mal mein Wissen erweitert...
-
Ja das geht - teilweise ist es auch sinnvoll:
int main() { const TTime start = gettime(); { Tclass test; /*...*/ } const TTime = gettime()-start; }und jetzt hast du die Zeit, die zum konstruieren und zerstören der klasse
Tclassbenötigt wird gemessen + die eventuellen Berechnungen, die durchgeführt werden sollen...
wenn du hier nicht die möglichkeit hättest, zusätzliche Scopes einzuführen (so nennen sich die Teile, die aus '{' und '}' (in Funktionen) entstehen, hättest du die Zeit des Desktruktors nicht mit betrachtet und somit wärst du beim Testen eingeschränkt...Man sieht es auch ab und an beim Locken von bestimmten Dateien:
void thread_function() { //... { TLock(ressource_x); ressource_x.foo(); } //... }ansonsten ein (analoges) Beispiel, was ja auch kompiliert aber keine sinnvollen Einsatzgebiete hat:
#include <iostream> int main() { std::cout << "hallo welt" << std::endl;;;;;;;;;;;;;;;;;;;;;;; }bb
Vorschau: war ich doch wieder zu langsam - naja, ich post es trotzdem mal ^^
-
bastl schrieb:
Die Klammern definieren lediglich einen Namensraum.
Wenn du also in einem Namensraum nichts anlegst ist das auch kein Fehler.
Alles O.K.Die haben mit Namensräumen nichts zu tun in dem Fall. Hier gehts um Gültigkeitsbereiche/Blöcke.
-
Das Thema scheint gerade populär zu sein...

http://www.c-plusplus.net/forum/viewtopic-var-t-is-241445.html