将枚举值设置为4字节字符串 - 为什么?

时间:2010-03-29 23:52:01

标签: c enums

我在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位整数等值分配给枚举值。我不能想到为什么这可能比使用简单整数更受欢迎。它在调试器中看起来很可怕(你怎么知道这些值中的哪一个对应于1919247481?)并且通常很难调试。

那么,是否有任何理由将这些字符串分配给枚举值实际上是有意义的。

3 个答案:

答案 0 :(得分:5)

正是因为调试器的你会做这样的事情。大多数调试器可以将内存显示为ASCII,如:

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

通过查看内存转储能够识别结构,常量等非常方便。特别是如果其中一个结构和/或常量覆盖了一堆你不想要它的内存......

答案 1 :(得分:3)

该格式称为四字符代码,或FOURCC。顺便提一下,它起源于Apple的Macintosh,如果你能用ASCII字符查看内存,它会非常方便。它也是一种在文件中嵌入4字节标识符的便捷方式,尽管它会在给定小端约定的情况下向后看。

答案 2 :(得分:0)

在gdb中,您可以通过执行以下操作来检查常量:

print (char[4]) val

虽然在英特尔和其他小端系统上,角色将被颠倒。使用PowerPC或68k处理器的较旧的Macintosh计算机在查看内存转储时会以正确的顺序显示字符。