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 switch
sur 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, eax
peut - ê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