Ich lese einen Emulatorcode durch und habe etwas wirklich Seltsames kontert:
switch (reg){
case 'eax':
/* and so on*/
}
Wie ist das möglich? Ich dachte man könnte nur switch
auf ganzzahlige Typen. Gibt es Makrotricks?
int
, daher ist dies legal. Der Wert einer Konstante mit mehreren Zeichen ist jedoch implementierungsdefiniert, sodass der Code auf einem anderen Compiler möglicherweise nicht wie erwartet funktioniert. Zum Beispiel eax
könnte sein 0x65
, 0x656178
, 0x65617800
, 0x786165
, 0x6165
, oder etwas anderes.
'eax' != 'ebx'
natürlich, so scheitert es nur an einem oder zwei Ihrer Beispiele. Obwohl es möglicherweise irgendwo Code gibt, der tatsächlich davon ausgeht *(int*)("eax") == 'eax'
und daher die meisten Ihrer Beispiele fehlschlägt.
'eax'
könnte ein Vergleich gleich 'ebx'
oder gleich sein 'ax'
, und die switch-Anweisung würde nicht wie beabsichtigt funktionieren.
'eax'
und es zählt konstanten ganzzahligen Wert auf