GCC: "variable x set but not used" für einzelne Var unterdrücken?

Gast #4230063
Lesenswert?
• ▲
▼
Hallo Zusammen,

der Titel sagts eigentlich schon:

Wie kann ich eine einzelne Warnung vom GCC:

"variable 'tmp' set but not used [-Wunused-but-set-variable]"

unterdrücken, ohne diese Warnungen direkt abzuschalten?

Situation:
Ich leere ein FIFO einer SSP(SPI)-Schnittstelle nach dem Senden eines 
Blocks, indem ich dummy reads mache.
Die Warnung ist also prinzipiell richtig, an dieser Stelle aber 
überflüssig..
1
void flushFifo()
2
{
3
  uint8_t tmp;
4

5
  while(SSPSR & SSP_RNE)
6
  {
7
    tmp = SSPDR; //Flush: set but not used is ok here
8
  }
9
}

Ist es möglich dem GCC mitzuteilen, dass dieses an dieser einen 
bestimmten Stelle ok ist? Oder muss ich weiterhin per Kommentar darauf 
aufmerksam machen, was da passiert?

Danke
dunno..
Gast #4230107
Lesenswert?
• ▲
▼
Stefan1234 schrieb:
> tmp volatile deklarieren.

Hilft nicht.

Peter II schrieb:
> dann lass doch die Variable weg
> void flushFifo()
> {
>   while(SSPSR & SSP_RNE)
>   {
>     SSPDR; //Flush: set but not used is ok here
>   }
> }

Das hatte ich anfangs so, wird aber mit einem
Statement has no effect 'SSPDR'
belohnt -
Das allerdings von der Code Analyse meines Eclipses, nicht von GCC.


Nach deinem post habe ich es nochmal so getestet, wenn ich das 
Disassembly richtig deute, tut es dann auch was es soll.

Also sollte ich mir wohl anschauen, warum die Code Analyse da nen 
Problem mit hat.....

btw:
1
#define SSPDR       (*((volatile unsigned long *) 0xE005C008))
Gast #4230146
Lesenswert?
• ▲
▼
Christoph H. schrieb:

> uint8_t tmp __attribute__((unused));
> Siehe auch
> https://gcc.gnu.org/onlinedocs/gcc-4.5.4/gcc/Variable-Attributes.html

Das funktioniert. Gut zu wissen, ich hatte mich bloß nicht getraut das 
Attribut anzuwenden, weil ich die Variable ja doch irgendwie benutze, 
und nicht riskieren wollte, dass die Zeile dann wegoptimiert wird, oder 
so..

A. K. schrieb:
> Probiers mal mit
>     (void)SSPDR;

Das funktioniert auch, es spart im vergleich zur Variante 1 die 
Variable, und entsprechend den Schreibzugriff auf das Register im ASM.

Drauf gekommen wäre ich allerdings nicht. -

Wieso funktioniert Variante 2 überhaupt?
Wenn ich jetzt Präprozessor spiele:
1
(void)(*((volatile unsigned long *) 0xE005C008));

also ein auf void gecasteter zugriff auf die Zieladresse eines 
pointers...?

Danke an Alle!

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.