Definitionsproblem von Variablen in klammerlosen ifs/whiles/fors
-
Hallo,
ich bin gerade zufällig über etwas gestolpert, was mich verwirrt hat.
Aber seht selbst, es ist ganz einfach.int main(int argc, char **argv) { while(1) int x; return 0; }
Kompiliert mit "gcc -Wall -std=c99 weird.c -o weird" gibt das ein
weird.c: In function 'main':
weird.c:5: error: expected expression before 'int'Wenn ich jetzt allerdings geschweifte Klammern um die Definition von x setz, krieg ich nur noch eine Warnung, dass x nicht benutzt wird.
Ich dachte, man kann sich die Klammern bei nur einer Anweisung sparen? Was ist hier genau das Problem?
Thx
-
Ganz einfach, eine Deklaration ist (syntaktisch) keine Anweisung. Mit geschweiften Klammern bildest du eine Verbundanweisung (compound statement), welche Deklarationen und Anweisungen enthalten darf.
-
Ok, das ist einleuchtend.
Danke für deine Erklärung.Aber weil du von "Deklaration" sprichst... "Definition" ist das richtige Schlüsselwort, oder?
-
"Deklaration" ist schon richtig, "Definitionen" gibt es nur für Funktionen, Typen und Macros.
Zur allgemeinen Erbauung, hier nochmal der relevante Teil der Syntax:
ISO/IEC 9899:TC3 schrieb:
iteration-statement: while ( expression ) statement do statement while ( expression ) ; for ( expression_opt ; expression_opt ; expression_opt ) statement for ( declaration expression_opt ; expression_opt ) statement statement: labeled-statement compound-statement expression-statement selection-statement iteration-statement jump-statement compound-statement: { block-item-list_opt } block-item-list: block-item block-item-list block-item block-item: declaration statement
-
Danke für die Übersicht.
Aber noch mal zu dem Unterschied zwischen den beiden Begriffen... Ich hab mal im Forum gewühlt und bin dann auf den FAQs von comp.lang.c gelandet, wo unter "definition" steht:
A declaration of a variable or function which allocates and optionally initializes (in the case of a variable) or provides the function body (in the case of a function).
"allocates storage" müsste das wohl heißen, oder? Und wenn ich "int x;" schreib, forder ich doch sagen wir mal 4 Bytes an.
-
Richtig, aber von der Syntax her handelt es sich um Deklarationen.
-
Perfekt, danke nochmal für deine Ausführungen.