Varieble referenzed but not never declared

Gast #1819123
Lesenswert?

Hallo,

wie der Titel vermuten lässt benutze ich die Keil uvision IDE für einen 
ARM cortexm3 STM32.

Beim Versuch das STM32 USART printf beispiel zu modifiezeren stoße ich 
auf folgendes Problem:

Sobald ich eine variable declariere
1
..
2
 s16 test=1;
3
..

gibt mir der Compiler folgende Fehlermeldung aus:
1
..\..\examples\USART\Printf\main.c(89): error:  #268: declaration may not appear after executable statement in block
2

3
..\..\examples\USART\Printf\main.c(89): warning:  #177-D: variable "test" was declared but never referenced

Im geposteten Beispiel habe ich nur die variable s16 eingefügt und sonst 
alles auf standart gelassen.

habt ihr eine Idee warum das passiert?

mfg
timo
#1819126
Lesenswert?

1. in C müssen in jedem Block erst die Deklarationen und
   Definitionen kommen, dann die ausführbaren Anweisungen.
   Deine s16 scheint nach einer ausführbaren Anweisung zu kommen.
2. Etwas mehr Quelltext erspart das Rätselraten.
3. Texte, die nicht in jedem Satz mehrere Fehler enthalten
   sind leichter lesbar.
Gast #1819132
Lesenswert?

Hallo,

vielen dank für die schnelle Hilfe.

kannst du mir ein stichwort geben damit ich weitere informationen 
googeln kann, oder mir erklären warum das nicht funktioniert ?

(bei programmen für Linux hatte ich damit noch keine probleme)



mfg
tom
#1819155
Lesenswert?

stm32 Keil uVision var declared but not referenzed schrieb im Beitrag 
#1819132:
> (bei programmen für Linux hatte ich damit noch keine probleme)

Das liegt daran, daß du da vermutlich den gcc genommen hattest.
Der kennt zum einen etliche verschiedene C-Standards (je nach
Compileroptionen), und zum anderen sieht er selbst bei einem
eingestellten älteren Standard recht großzügig über viele
eigentlich nicht zulässige Dinge hinweg.

Beispiel: Mit der Option -std=c89 akzeptiert er sowohl
Quelltext nach ISO-C89, als auch etliche Erweiterungen.
Dein Beispiel, in dem erst ausführbare Anweisungen kommen und
dann nochmal Deklarationen/Definitionen, wäre nach C89 eigentlich
falsch, der gcc sagt aber nichts dazu und schluckt es.
Mit -std=c89 -pedantic akzeptiert er ebenfalls C89, meckert aber
alles an, was über C89 hinausgeht. Dein Programm wäre damit
also falsch.
Mit -std=c99 ist es in jedem Fall wieder richtig, egal ob mit
oder ohne -pedantic.

Wieder: http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren