Je lis un code d'émulateur et j'ai contré quelque chose de vraiment étrange:
switch (reg){
case 'eax':
/* and so on*/
}
Comment est-ce possible? Je pensais que vous ne pouviez que switchsur les types intégraux. Y a-t-il des tromperies macro?
int, donc c'est légal. Cependant, la valeur d'une constante à plusieurs caractères est définie par l'implémentation, de sorte que le code peut ne pas fonctionner comme prévu sur un autre compilateur. Par exemple, eaxpeut - être 0x65, 0x656178, 0x65617800, 0x786165, 0x6165, ou autre chose.
'eax' != 'ebx', bien sûr, cela ne fait échouer qu'un ou deux de vos exemples. Bien qu'il puisse y avoir du code quelque part qui en fait suppose *(int*)("eax") == 'eax', et donc échoue la plupart de vos exemples.
'eax'pourrait comparer égal à 'ebx'ou à 'ax', et l'instruction switch ne fonctionnerait pas comme prévu.
'eax'et elle énumère la valeur entière constante