Flag -Bitset, Kollisionen vermeiden, c
Frage
Ich habe eine Flaggen-Halt-Ganzzahl, die vorhandenen Flaggen vorhanden ist:
#define MAIL_ADDR_FROM 0x0001 /* address field contains the from address */
#define MAIL_ADDR_TO 0x0002 /* address field contains the to address */
#define MAIL_SEEN 0x0004 /* message has been read by the user */
#define MAIL_ATTACH 0x0008 /* message has an attachment */
#define MAIL_IMP_HIGH 0x0010 /* message is of high importance */
#define MAIL_IMP_LOW 0x0020 /* message is of low importance */
#define MAIL_FLAGGED 0x0040 /* message has been flagged */
#define MAIL_REPLIED 0x0080 /* message has been replied to */
#define MAIL_DRAFT 0x0100 /* message is a draft */
#define MAIL_NEW 0x0200 /* message is new */
#define MAIL_DELETED 0x8000 /* message is deleted */
Ich muss eine neue hinzufügen:
#define MAIL_SPAM 0x???? /* message is spam */
Gibt es einen Grund, warum die vorhandene Flag -Liste von 0x0200 bis 0x8000 überspringt? Mein Verständnis ist, dass nutzbare Werte für mein neues Flag 0x0400, 0x0800 und 0x1000-0x4000 sein würden. Verstehe ich etwas darüber, wie diese Bitssätze funktionieren?
Lösung
Ja, Sie haben Recht - diese fehlenden Flaggenwerte sind theoretisch verwendet, es sei denn, sie sind für etwas anderes reserviert.
Sie müssten sich beim ursprünglichen Autor erkundigen, wenn es einen bestimmten Grund gibt, warum sie übersprungen wurden und direkt zuging zu 0x8000
.
Es gibt sicherlich keine intrinsisch Verhalten in Bitfeldern, die ihre Verwendung verhindern würden.
Andere Tipps
Kurz gesagt, Ihr Verständnis ist in Ordnung.
Wir können nur erraten warum MAIL_DELETED
ist 0x8000
und nicht, sagen wir, 0x0400
; Ich vermute, dass das höchste Stück aufgrund der dramatischen Natur der "gelöschten" Flagge ausgewählt wurde.
Der schwierigste Teil der Einführung eines neuen Bits in die Bitmaske eines anderen ist, dass Sie sicherstellen müssen, dass die unbenutzten Teile tatsächlich nicht genutzt werden und dass sie immer konsequent initialisiert werden.
Es hängt alles davon ab, wer es geschrieben hat, was sie gemeint durch ihre gewählten Bitpositionen. Nach dem, was ich sehen kann, sieht es jedoch so aus, als hätten sie die Bitflags logisch in Bytes gruppiert.
Für Ihre könnten Sie einen Fall machen für:
#define MAIL_SPAM 0x0400 /* message is spam */
Da es wie ein Staat ähnelt wie neu oder entwurf, aber nicht gelöscht.
Ich bin mit Ihrer Anwendung nicht vertraut, aber theoretisch sind die Werte 0x400,0x800,0x1000,0x2000 und 0x4000 nicht definiert und passen perfekt zu Ihren anderen Definierungen, sodass Sie mit diesen Werten neue Definition hinzufügen können.
Klingt für mich nach schlechter Dokumentation. Ich hätte mail_flag_unused in den letzten paar Bit -Slots so platziert, dass es offensichtlich war, dass sie verfügbar waren. Überprüfen Sie, ob mail_new die höheren Bits nicht für einen eingebetteten Wert verwendet, aber auf der Oberfläche scheinen Sie eine Reihe von Bits von 0x0400 bis 0x4000 zu haben.