4 Stimmen

Ist int x = 'fooo' eine Compiler-Erweiterung?

Ich habe C++-Code wie den folgenden gesehen und verwendet:

int myFourcc = 'ABCD';

Es funktioniert in neueren Versionen von GCC, nicht sicher, wie neu. Ist diese Funktion im Standard enthalten? Wie wird sie genannt?

Ich hatte Schwierigkeiten, im Internet danach zu suchen...

EDIT:

Ich habe auch diese Information für zukünftige Beobachter gefunden:

von gcc-Dokumentation

Der Compiler bewertet eine mehrstellige Zeichenkonstante zeichenweise, indem er den vorherigen Wert um die Anzahl der Bits pro Zielzeichen nach links verschiebt und dann das Bitmuster des neuen Zeichens, das auf die Breite eines Zielzeichens abgeschnitten ist, einbindet. Das endgültige Bitmuster hat den Typ int und ist daher vorzeichenbehaftet, unabhängig davon, ob einzelne Zeichen vorzeichenbehaftet sind oder nicht (eine kleine Änderung gegenüber den Versionen 3.1 und früher des GCC). Wenn die Konstante mehr Zeichen enthält, als in den Ziel-Int passen würden, gibt der Compiler eine Warnung aus, und die überschüssigen führenden Zeichen werden ignoriert.

Zum Beispiel würde 'ab' für ein Ziel mit einem 8-Bit-Zeichen wie folgt interpretiert werden (int) ((unsigned char) 'a' * 256 + (unsigned char) 'b')', and '\234a' as (int) ((unsigned char) ' \234 ' * 256 + (unsigned char) 'a')'.

7voto

Adam Rosenfield Punkte 373807

Siehe Abschnitt 6.4.4.4, Absatz 10 des C99-Standards:

Eine ganzzahlige Zeichenkonstante hat den Typ int . Der Wert einer ganzzahligen Zeichenkonstante die ein einzelnes Zeichen enthält, das auf ein Ein-Byte-Ausführungszeichen abgebildet wird, ist der der numerische Wert der Darstellung des zugeordneten Zeichens, interpretiert als ganze Zahl. Der Wert einer Integer-Zeichenkonstante, die mehr als ein Zeichen enthält (z. B., 'ab' ) oder ein Zeichen oder eine Escape-Sequenz enthält, das bzw. die nicht auf ein Ein-Byte Ausführungszeichen entspricht, ist implementierungsabhängig. Enthält eine Integer-Zeichenkonstante ein einzelnes Zeichen oder eine Escape-Sequenz, ist ihr Wert derjenige, der sich ergibt, wenn ein Objekt mit Typ char dessen Wert der eines einzelnen Zeichens oder einer Escape-Sequenz ist, wird in Typ int .

Erinnern Sie sich, dass Implementierung definiert bedeutet, dass die Implementierung (in diesem Fall der C-Compiler) tun kann, was sie will, aber es muss dokumentiert werden .

Die meisten Compiler wandeln sie in eine ganzzahlige Konstante um, die der Verkettung der Oktette entspricht, die den einzelnen Zeichen entsprechen, aber die Endianness könnte entweder Little- oder Big-Endian sein, je nach Endianness der Zielarchitektur.

Daher sollte portabler Code keine mehrstelligen Konstanten verwenden und stattdessen einfache, ganzzahlige Konstanten einsetzen. Anstelle von 'abcd' die eine beliebige Endianness haben können, entweder 0x61626364 oder 0x64636261 verwenden, deren Endianness bekannt ist (big bzw. little).

6voto

chaos Punkte 118918

"Beachten Sie, dass es nach dem C-Standard keine Begrenzung für die Länge einer Zeichenkonstante gibt, aber der Wert einer Zeichenkonstante, die mehr als ein Zeichen enthält, ist implementierungsabhängig. Neuere Versionen des GCC unterstützen Multi-Byte-Zeichenkonstanten, und anstelle eines Fehlers erscheinen die Warnungen mehrstellige Zeichenkonstante o Warnung: Zeichenkonstante zu lang für ihren Typ werden in diesem Fall erzeugt."

5voto

John Smith Punkte 4285

Der C++-Standardentwurf sagt:

Ein Zeichenliteral ist ein oder mehrere Zeichen, die in einzelne Anführungszeichen, wie in 'x'

und

Ein gewöhnliches Zeichenliteral, das mehr als ein c-Zeichen enthält, ist ein Multicharacter-Literal. Ein Multichar- Zeichenliteral hat den Typ int und Implementierungsdefinierter Wert .

1voto

Juliano Punkte 35709

Ja, es handelt sich um einen Standard, der jedoch implementierungsabhängig ist.

In der Praxis steht er für die 32-Bit-Ganzzahl, die man durch Verkettung der Bytes 'A', 'B', 'C' und 'D' erhält.

0voto

Martin Beckett Punkte 92477

Als konkretes Beispiel wird die ID eines Datenspeicherformats genannt, falls es jemanden interessiert.
Es ist sehr nützlich, einen für Menschen lesbaren Wert einer Konstante zu erhalten, z. B. "XVID" und nicht nur 1234. Es lohnt sich, darüber nachzudenken, wenn Sie beliebige Integer-Schlüssel erstellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X