ich bin auch nicht sofort drauf gekommen.
Deine Fehlermeldung musste ich mir noch mal auf der Zunge zergehen lassen:
er vermisst also einen Befehl oder Ausdruck ("primary expression") vor dem '}' Bezeichner/Zeichen ("Token") .expected primary-expression before '}' token
also habe ich einfach mal einen ganz simplen "echten" Code geschrieben, keine Umschreibungen wie Block A etc, und kompiliert (s.o.) - und siehe da, wenn man ihm nach der Sprungmarke noch den simpelst möglichen Befehl oder Ausdruck gibt, dann geht's!
Und tatsächlich:
schaut man in der Sprachdefinition nach, dann steht da:
also muss nach der Sprungmarke erst noch ein statement folgen, bevor die "Klammer-Zu" vom Block-Ende kommen darf, ganz egal ob C oder C++, und statements enden immer mit einem ";", und das einfachste denkbare statement ist nur ein ";" (ein sog. null-statement).Syntax
goto label ;
label : statement
Notes
Because declarations are not statements, a label before a declaration must use a null statement (a semicolon immediately after the colon).
Same applies to a label before the end of a block.
C++ imposes additional limitations on the goto statement, but allows labels before declarations (which are statements in C++)
(http://en.cppreference.com/w/c/language/goto)
Abschließend betrachtet war es wichtig, einfach mal das Problem an einem möglichst einfachen Beispiel durchzuspielen, nicht am komplizierten Projekt-Code, und auf keinen Fall mit Pseudo-Umschreibungen als Platzhalter.
PS,
insb. @ Klebwax und morob:
Die Arduino-loop() hat bestimmte Eigenheiten, die besondere Programmiertechniken erfordern, indes ist ein goto auch sonst immer noch völlig legaler C- und C++ -Code, auch wenn es manchen Leuten geschmacklich nicht passt. Darum führen solche Einwürfe wie eure generell nicht weiter - denn wie heißt es so schön:
de gustibus non est disputandum.
Lesezeichen