2010-03-29 87 views
2

我看到了在Mac OS SDK类似下面的代码:将枚举值设置为4字节的字符串 - 为什么?

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?),并在总体上使调试只是很难狰狞。

因此,没有任何理由在那里分配这样的字符串其实是有道理的枚举值。

+0

我不明白多字符字符文字 – 2010-03-29 23:54:08

+0

允许多字符整数字符常量(至少C99),但该值是实现定义的(见第6.4.4.4节)。 – 2010-03-30 00:15:13

回答

5

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

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

如果能够通过看内存转储,以确定结构,常量,等等是非常方便的。特别是如果这些结构和/或常量之一改写了一堆内存,你不希望它....

+0

啊。我不认为我曾经需要在实时调试会话的内存窗口中查看enum字段的值,但我想这可能对脱机内存转储很有帮助。不同的endian-ness肯定会使它很难/不可能使用。 – psychotik 2010-03-30 00:08:25

+0

@psychotik,内存战靴是最好的情况。想象一个充满了这样的枚举的结构,吹过你的堆栈。现在,当您用调试器查看内存时,您可以希望识别发生了什么。字节顺序不是很重要的 - 你习惯于向后读取它们。 – 2010-03-30 00:10:16

3

该格式被称为四个字符的代码,或FOURCC。顺便说一句,它源于苹果与Macintosh,如果你可以用ASCII字符查看内存,这很方便。这也是嵌入在文件中4个字节的标识符的便捷方式,虽然会向后看给予小端约定。

0

在gdb中,您可以通过检查不变:

print (char[4]) val 

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