Forum: Mikrocontroller und Digitale Elektronik Warnungen beim Compilieren aktivieren


von Knut (Gast)


Lesenswert?

Moin,

ich würde gern, dass der Compiler bei
1
if(xy = 5)...
meckert.

Ich verwende die AVR Studio 4.19 und die aktuelle Toolchain.
In der Version davor hat er das immer gemacht, nun nicht mehr.
Was muss ich bei den Optionen "reinschreiben" damit er das wieder tut?



Danke

Knut
von Klaus W. (mfgkw)


Lesenswert?

bei -Wall sollte das dabei sein, notfalls -Wextra.

Generell sollte man so kompilieren, weil da auch andwere interessante 
Sachen dabei sind.
von Peter II (Gast)


Lesenswert?

Knut schrieb:
> ich würde gern, dass der Compiler bei
> if(xy = 5)...
> meckert.

dann schreibe doch mal
1
if( 5 = xy )...
von Knut (Gast)


Lesenswert?

Peter II schrieb:
> dann schreibe doch mal...

passiert nichts, deswegen habe ich ja gefragt.
1
  if 
2
    (
3
      (
4
        (!(PINB &(1<<T_RELEASE))) && (debounce_t_release == AUS)
5
      )
6
     ||
7
      (
8
        (status ==STATE_SHORTCIRQUIT) && (restart_interlock_timer==0)
9
      )
10
    )

wenn ich nun debounce_t_release == AUS gegen
             debounce_t_release = AUS ersetze merkt er es nicht.
1
if( 5 = xy )...
das hingegen merkt er. Was mache ich denn falsch?
-Wall ist eingeschaltet.

Knut
von Karl H. (kbuchegg)


Lesenswert?

Knut schrieb:
> Peter II schrieb:
>> dann schreibe doch mal...
>
> passiert nichts, deswegen habe ich ja gefragt.
>
1
>   if
2
>     (
3
>       (
4
>         (!(PINB &(1<<T_RELEASE))) && (debounce_t_release == AUS)
5
>       )
6
>      ||
7
>       (
8
>         (status ==STATE_SHORTCIRQUIT) && (restart_interlock_timer==0)
9
>       )
10
>     )
11
>
>
> wenn ich nun debounce_t_release == AUS gegen
>              debounce_t_release = AUS ersetze merkt er es nicht.
>
>
1
> if( 5 = xy )...
2
>
> das hingegen merkt er. Was mache ich denn falsch?

Die Reihenfolge!

if ( x = 5 )

ist etwas anderes als

if ( 5 = x )


das erste ist der Versuch an x den Wert 5 zuzuweisen. Das zweite der 
Versuch an 5 den Wert von x zuzuweisen. An 5 kann man nichts zuweisen. 
In C-Speak ist 5 kein L-Value. Das ist ein Syntax Fehler, den dir der 
COmpiler auf keinen Fall duchgehen lassen wird.

Aber ganz ehrlich: derartige Fehler macht man am Anfang ein paar mal, 
dann hat man sich daran gewöhnt einen Vergleich mit == zu schreiben und 
dann kommt es nur noch gaaaanz selten vor.
von Knut (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Aber ganz ehrlich: derartige Fehler macht man am Anfang ein paar mal,
> dann hat man sich daran gewöhnt einen Vergleich mit == zu schreiben und
> dann kommt es nur noch gaaaanz selten vor.

Aber wenn von den zwei Tastenanschlägen nur einer ankommt is auch doof.

Aber:
>> wenn ich nun debounce_t_release == AUS gegen
>>              debounce_t_release = AUS ersetze merkt er es nicht.

wo ist hier das Problem, oder stehe ich aufm Schlauch?


Knut
von Stefan E. (sternst)


Lesenswert?

Knut schrieb:
> Aber:
>>> wenn ich nun debounce_t_release == AUS gegen
>>>              debounce_t_release = AUS ersetze merkt er es nicht.
>
> wo ist hier das Problem, oder stehe ich aufm Schlauch?

Das steht in einer Klammer innerhalb der "if-Klammer". Da bekommst du 
nie eine Warnung, ...
> In der Version davor hat er das immer gemacht, nun nicht mehr.
... auch nicht in der Version davor.

Wenn man ganz bewusst dort eine Zuweisung haben will, schreibt man 
deswegen auch
1
if ( (x = 5) )
von Karl H. (kbuchegg)


Lesenswert?

Knut schrieb:

> wo ist hier das Problem, oder stehe ich aufm Schlauch?

Das Problem ist, dass

  if( x = irgendwas )
durchaus legales gültiges C ist, welches auch seinen Sinn haben kann.

Also hat man sich beim GCC auf einen Kompromiss geeinigt:
Schreibt man das so

  if( x = irgendwas )

dann warnt der COmpiler vor der Zuweisung.
Schreibt man das so

  if( (x = irgendwas) )

dann deutet man dem Compiler damit an: Es ist ok, ich will wirklich eine 
Zuweisung haben.

Und du hast eine ( ) rund um deinen Ausdruck: daher -> keine Warnung.
von asd (Gast)


Lesenswert?

Stefan Ernst schrieb:
> Das steht in einer Klammer innerhalb der "if-Klammer". Da bekommst du
> nie eine Warnung, ...
>> In der Version davor hat er das immer gemacht, nun nicht mehr.
> ... auch nicht in der Version davor.

Exakt.

  if (x = 9)

generiert eine "suggest parenthesis around assignment used as truth 
value" Warning, aber

  if ((x = 9))

eben nicht.

Der passende Parameter ist -Wparentheses (is bei -Wall schon dabei).
von Knut (Gast)


Lesenswert?

Ok, danke für den Hinweis.




Knut
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.