Установка значений перечисления в 4-байтовые строки - почему? - PullRequest
2 голосов
/ 30 марта 2010

Я видел код, подобный этому в Mac OS SDK:

enum {
   kAudioFileStreamProperty_ReadyToProducePackets    = 'redy',
   kAudioFileStreamProperty_FileFormat               = 'ffmt',
   kAudioFileStreamProperty_DataFormat               = 'dfmt',
   kAudioFileStreamProperty_FormatList               = 'flst',
   kAudioFileStreamProperty_MagicCookieData          = 'mgic',
   kAudioFileStreamProperty_AudioDataByteCount       = 'bcnt',
   kAudioFileStreamProperty_AudioDataPacketCount     = 'pcnt',
   kAudioFileStreamProperty_MaximumPacketSize        = 'psze',
   kAudioFileStreamProperty_DataOffset               = 'doff',
   kAudioFileStreamProperty_ChannelLayout            = 'cmap',
   kAudioFileStreamProperty_PacketToFrame            = 'pkfr',
   kAudioFileStreamProperty_FrameToPacket            = 'frpk',
   kAudioFileStreamProperty_PacketToByte             = 'pkby',
   kAudioFileStreamProperty_ByteToPacket             = 'bypk',
   kAudioFileStreamProperty_PacketTableInfo          = 'pnfo',
   kAudioFileStreamProperty_PacketSizeUpperBound     = 'pkub',
   kAudioFileStreamProperty_AverageBytesPerPacket    = 'abpp',
   kAudioFileStreamProperty_BitRate                  = 'brat'
};

Впервые я увидел это - я предполагаю, что компилятор присваивает 32-битному целочисленному эквиваленту строк значения enum. Я не могу придумать одну вескую причину, почему это может быть предпочтительнее, чем использование простых целых чисел. Это выглядит отвратительно в отладчике (как вы узнаете, какое из этих значений соответствует 1919247481?) И вообще затрудняет отладку.

Итак, есть ли причина, по которой присвоение таких строк значениям enum действительно имеет смысл.

Ответы [ 3 ]

5 голосов
/ 30 марта 2010

Это точно , потому что отладчика, что вы сделали бы такую ​​вещь. Большинство отладчиков могут отображать память как ASCII, что-то вроде:

00000000: 12 34 56 78 90 12 45 67 12 34 56 78 89 ab cd ef .4Vx..Eg.4Vx....  

Возможность определить структуры, константы и т. Д., Просто взглянув на дамп памяти, очень удобна. В частности, если одна из этих структур и / или констант перезаписала кучу памяти, вы этого не хотели ....

3 голосов
/ 30 марта 2010

Этот формат называется четырехсимвольным кодом или FOURCC. Кстати, он произошел от Apple с Macintosh, и это очень удобно, если вы можете просматривать память в символах ASCII. Это также удобный способ встраивания 4-байтовых идентификаторов в файл, хотя он будет выглядеть задом наперед с учетом порядкового номера.

0 голосов
/ 30 марта 2010

В gdb вы можете проверить константу, выполнив:

print (char[4]) val

Хотя в Intel и других системах с прямым порядком байтов символы будут обратными.Старые компьютеры Macintosh, в которых использовались процессоры PowerPC или 68k, отображали символы в правильном порядке при просмотре дампа памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...