Я использовал следующий фрагмент кода для чтения данных из файлов как части более крупной программы.
double data_read(FILE *stream,int code) {
char data[8];
switch(code) {
case 0x08:
return (unsigned char)fgetc(stream);
case 0x09:
return (signed char)fgetc(stream);
case 0x0b:
data[1] = fgetc(stream);
data[0] = fgetc(stream);
return *(short*)data;
case 0x0c:
for(int i=3;i>=0;i--)
data[i] = fgetc(stream);
return *(int*)data;
case 0x0d:
for(int i=3;i>=0;i--)
data[i] = fgetc(stream);
return *(float*)data;
case 0x0e:
for(int i=7;i>=0;i--)
data[i] = fgetc(stream);
return *(double*)data;
}
die("data read failed");
return 1;
}
Теперь мне говорят использовать -O2
, и я получаю следующее предупреждение gcc: warning: dereferencing type-punned pointer will break strict-aliasing rules
Погуглив, я нашел два ортогональных ответа:
vs
В конце концов, я не хочу игнорировать предупреждения. Чтобы вы посоветовали?
[update] Я заменил игрушечный пример настоящей функцией.
char
(т. е. указательchar
всегда может использовать псевдоним для других указателей, если только он неrestrict
ed.) Может быть, вам нужно сделать егоunsigned char
для того, чтобы это применялось ..? Мне было бы интересно увидеть правильный ответ. - person R.. GitHub STOP HELPING ICE   schedule 14.07.2010