Dieser source-code ist der Wechsel auf einen string in C. Wie macht es das?

Bin ich beim Lesen über einige emulator-code und ich habe gekontert etwas wirklich sonderbares:

switch (reg){
    case 'eax':
    /* and so on*/
}

Wie ist das möglich? Ich dachte, Sie könnten nur switch auf integral-Typen. Gibt es ein paar makro-Tricks Los?

  • es ist nicht die Zeichenfolge 'eax' und es zählt konstanter integer-Wert
  • Einfache Anführungszeichen, keine doppelten. Eine Zeichenkonstante wird gefördert int, so dass es legal ist. Allerdings ist der Wert eines multi-character-Konstante ist durch die Implementierung festgelegt, so dass der code funktioniert möglicherweise nicht wie erwartet auf einem anderen compiler. Zum Beispiel eax sein könnte 0x65, 0x656178, 0x65617800, 0x786165, 0x6165, oder etwas anderes.
  • der name von der variable "reg", und die Tatsache, dass eax ist ein x86-register, würde ich vermuten, dass die Implementierung-definiert das Verhalten beabsichtigt war OK, denn es ist überall das gleiche, es ist im code verwendet. Nur so lange, wie 'eax' != 'ebx' natürlich, also es schlägt nur ein oder zwei Ihrer Beispiele. Obwohl es möglicherweise einige code irgendwo, dass in der Tat davon ausgegangen *(int*)("eax") == 'eax', und daher schlägt fehl, die meisten Ihrer Beispiele.
  • Ich don ' T nicht einverstanden mit dem, was Sie sagen, aber es besteht die Reale Gefahr, dass jemand versuchen könnte, um den code zu kompilieren, der auf einem anderen compiler, auch für die gleiche Architektur, und ein anderes Verhalten. Zum Beispiel 'eax' vielleicht vergleichen Sie gleich 'ebx' oder zu 'ax', und die switch-Anweisung nicht funktionieren würde, wie gedacht.
  • Alle, die mystery hätte schnell gebannt, wenn Sie angeschaut hatte bis/uns gezeigt, wie der Datentyp der reg.
  • Übrigens, ich würde dazu neigen, betrachten Sie diesen code stinkig. Warum nicht die original-designer definieren Sie eine Enum-Konstante reg_eax mit einem nice-Wert, wie null? switch Aussagen umfasst Sätze von nicht-konsekutive, große Werte nicht kompilieren in schönen Sprung-Tabellen.

InformationsquelleAutor Ian Colton | 2017-08-07
Schreibe einen Kommentar