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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.