PIC C18 Fehlermeldung: [2060] shift expression has no effect?

OP #853219
Lesenswert?

Hallo allerseits,
hab ein kleines Problem mit einer Fehlermeldung (warning) mit dem C18 
Compiler.

(PIC18F2550)
1
#define bit_set(var,bitnr)   ((var) |= 1 << (bitnr)) // Einzelnes Bit setzen
2

3
main
4
{
5
unsigned char Messprotokoll[10];      
6
...
7
bit_set(Messprotokoll[4],0);
8
oder
9
bit_set(ADCON0,0);
10
...
11
}

Fehlermeldung:
D:\PIC_Soft\main.c:347:Warning [2060] shift expression has no effect

Und zwar taucht die Meldung auf, wenn ich das Bit 0 einer Variablen 
abfragen will. C18_User_Guide meint dazu:
2060: shift expression has no effect
Shifting a value by zero bits has no effect on the value of the 
expression.

Wieso sollte das Setzen/Rücksetzen des Bit 0 nichts am Wert ändern?
Gezählt wird doch von Bit0...Bit7. Oder wo hab ich meinen Denkfehler?
Wenn ich mir die Variablen im Debugger anschau, dann werden die 
richtigen Bits schon gesetzt, aber das warning wird ja nicht zum Spaß da 
sein.

Wäre klasse, wenn mir jemand nen Tipp geben könnte.
Gast #853225
Lesenswert?

Die Anweisung als Ganzes hat natürlich schon einen Effekt, aber nicht
die Shift-Operation. Ob du

  x |= 1<<0;

oder

  x |= 1;

schreibst, ist das Gleiche, also ist die <<-Operation eigentlich
überflüssig, und der Compiler wittert fälschlicherweise ein Versehen
von deiner Seite.

Vielleicht gibt es ja eine Compiler-Option, mit der man alle
2060-Warnungen abschalten kann.
OP #853240
Lesenswert?

Danke für deine Antwort. Zu meiner Schande muss ich gestehen, dass ich 
das #define übernommen habe, ohne dessen Ablauf zu durchdenken.

Also dann aber jetzt:
 "<<" verschiebt hier eine 1 um 0 Stellen nach oben, richtig?
  x |= 1<<0;

Und weil C18 dieses Shift für überflüssig hält gibt er ne Warnung aus!?
OK, in diesem Fall kann ich mit der Warnung beim Compilieren leben.

Danke für die Hilfe.
Gast #853260
Lesenswert?

> "<<" verschiebt hier eine 1 um 0 Stellen nach oben, richtig?

So isses. Der Compiler sieht ja den Code erst, nachdem der
Präprozessor darin alle Makros (wie bit_set) expandiert hat. Und da
taucht nun einmal dieses seltsam anmutende 1<<0 auf.

Da solche Makros wie bit_set übliche Vorgehensweise sind, halte ich
die beschriebene Warnung nicht für sehr sinnvoll, da sie, wenn sie in
großer Anzahl auftritt, den Blick auf die wirklich ernstzunehmenden
Meldungen versperrt. Aber wie gesagt, vielleicht kann man sie ja
deaktivieren.

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