Zitat Zitat von Joerg
Das heißt beide Konstantenausdrücke werden vom Compiler aufgelöst und dementsprechend richtig ausgerechnet übersetzt.
Zitat Zitat von Felix G
prinzipiell sind die Varianten natürlich gleichwertig,
aber ich bevorzuge dennoch die (1 << x) Variante, da diese Compilerunabhängig ist.
Die Ausdrücke sind nicht nur gleichwertig, sondern ein und dasselbe. _BV() wird nicht vom Compiler ausgewertet, sondern ist lediglich ein Macro und wird damit vom Präprozessor aufgelöst.

Zitat Zitat von ./avr/include/avr/sfr_defs.h
#define _BV(bit) (1 << (bit))
avr/sfr_defs.h wird von avr/io.h includet, so daß man es eh dabei hat.

In sfr_defs.h werden auch Sachen defined wie
bit_is_clear(sfr, bit)
loop_until_bit_is_set(sfr, bit)
etc...

Mit der Compilerabhängigkeit ist das so ne Sache.
Hardwarenahe Dinge werden durch verschiedenen Compiler meist verschieden ausgedrückt, wie zB die Definition von Interrupts und Signals. Alles andere hat mit dem Compiler eigentlich nix zu tun. Jedenfalls lassen sich Makros wie bit_is_clear() leichter portieren als wenn man immer selber hinschreibt, zu was das Makro expandiert. Beim Compilerumstieg braucht man dann nämlich nur eine Zeile im Header anzufassen und nicht die ganze Quelle nachzukontrollieren.