2010-03-29 89 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計算機在查看內存轉儲時將按照正確的順序顯示字符。