Bit-Felder vom Typ als int?
Habe ich einen code verwendet bit-Felder wie folgt deklariert
typedef struct my{
const char *name;
uint8_t is_alpha : 1;
uint8_t is_hwaccel : 1;
uint8_t x_chroma_shift;
uint8_t y_chroma_shift;
} mystr;
uint8_t
ist typedef ' ed zu unsigned char
.
Bau den code in MS-VS 2008 verwenden diese bit-Felder gibt eine Warnung wie folgt:
imgconvert.c(60) : warning C4214: nonstandard extension benutzt : bit-Feld andere Typen als int.
- Gibt es irgendwelche Probleme/potentielle Probleme mit der Verwendung von bit-Feldern von anderen Typ als int? Warum die Warnung?
- Anderen als int-Datentyp bit-fileds Sie dürfen von C99 der C-Sprache Spezifikation?
- Die Warnung ist selbsterklärend: Nichtstandard-Erweiterung verwendet ; der code kann haben Portabilität Probleme.
- Typ int ist nützlich, aus Portabilität Aspekte nur, wenn alle Ziele/compiler haben die gleiche Größe von ints.
- Sie sind schriftlich über die bitfields hier, Ihre Größe ist im code angegeben.
- Das problem ist nicht die Größe der Bitfeld (es ist angegeben), aber die Größe der maximalen Bitfeld (nicht größer als die type) oder die Polsterung (zwei 1-bits sind verpackt in 8bit-int mit 6 unbenutzte bits, die für ein int, es wäre 2 verwendet und 30 frei).
- Einem anderen thread, die Sie interessieren könnten: stackoverflow.com/questions/54719855/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da die bit-Felder sind low-level ist, kann es Probleme mit der Portabilität, wenn Sie mit nicht-standard-Typen. Daher die Warnung -- Hinweis: es ist immer noch eine Warnung und kein Fehler.
Aus dem Entwurf des C99:
char
haben die gleiche Größe für alle Maschinen. Die Größe einesint
ist nur definiert als ein Bereich, so ist es nicht sehr nützlich, aus der Portabilität Perspektive. Diestdint
header wurde Hinzugefügt, für diesen Zweck zu C99. Ich denke, Sie sollten in Ordnung sein mit der Warnung.int
s. Beim Umgang mit bitfields, der compiler könnte, pack Sie in ein Einzelzimmerint
oder geben Sie Ihre eigenenint
. Wenn Sie versuchen, erstellen Sie ein struct mit einem Datei-format oder Protokoll-format, nicht mit bitfields.Warum nicht
int
? Die tatsächliche Umsetzung von bitfields variiert von compiler zu compiler. Wenn Sie möchten, schreiben portablen code, verwendenint
. Wenn Sie möchten, erstellen Sie eine kleine Struktur oder eine Struktur, eine Feste Anzahl von bytes, oder eine Struktur, bei der die bits sind in einer festen position, nicht mit bitfields. Erstellen Sie eineuint8_t
Mitglied heißt so etwas wieflags
und Makros definieren, um die Verwendung als Bitmasken.unsigned int
.uint8_t
nicht, wirdint
unterzeichnet ist, mischen ist nicht gut.Wie andere erwähnt haben über portabilitätsprobleme et al, wenn Sie nicht wissen, Sie können nur deaktivieren Sie die Warnung über die Warnung pragma:
https://docs.microsoft.com/en-us/cpp/preprocessor/warning?view=vs-2019
Sie können auch deaktivieren Sie bestimmte Warnungen in Ihrem Projekt Eigenschaften, aber dann sind Sie Projekt breit. Auf diese Weise können Sie Steuern, je nach Datentyp.
Dann, wenn Sie nicht immer 100% sicher was für eine Art von Binär-code MSVC generieren, die für diese entweder führen Sie es im debugger, und Blick auf die "disassembly anzeigen" (Pause auf, wo es wird zugegriffen), oder laden Sie Ihre ausführbare Datei (mit der PDB-Datei für die Symbole) in einem disassembler wie IDA Pro, Ghidra, etc.