LINUX.ORG.RU

[c] Зачем нужны multicharacter constants?

 


0

1

Часто встречаю, особенно, в эпловских сдк объявления типа

enum {
   kAudioFilePropertyFileFormat            = 'ffmt',
   kAudioFilePropertyDataFormat            = 'dfmt',
   kAudioFilePropertyIsOptimized           = 'optm',
   kAudioFilePropertyMagicCookieData       = 'mgic',
   kAudioFilePropertyAudioDataByteCount    = 'bcnt',
   kAudioFilePropertyAudioDataPacketCount  = 'pcnt',
   kAudioFilePropertyID3Tag                = 'id3t',
   ....
};

Часто приходится отлаживать код, и когда в gdb видишь число 16123112 - попробуй догадаться, какому енуму это соответствует.

Собственно, какая польза от объявления енумов таким образом?

★★
Ответ на: комментарий от bk_

Не важно, я уже загуглил, откуда приведённый пример.

Может это просто сделано для того, чтобы проще было анализировать дамп, когда что-нибудь падает?

geekless ★★
()

>Часто приходится отлаживать код, и когда в gdb видишь число 16123112 - попробуй догадаться, какому енуму это соответствует.

К gdb можно писать плагины на питоне для «расшифровки» отладки. Наверняка у эппловцев они есть :)

annulen ★★★★★
()

польза такая, что 4байтовая строка представляется в виде числа uint32, которое можно копировать в регистрах, не используя всякие strcpy и подобное. очень удобная фича imho.

waker ★★★★★
()
Ответ на: комментарий от waker

Да, но, во-первых, эта возможность объявлена как implementation-defined.

Например, у меня на дебиане получается строка наоборот:

zdo@mamburu:/tmp$ cat c.c
main()
{
	int a = 'fuck';
	char *s = (char *)&a;
	printf("%d s=%c%c%c%c\n", a, s[0], s[1],s[2],s[3]);
}
zdo@mamburu:/tmp$ gcc c.c
c.c:3:10: warning: multi-character character constant
c.c: In function ‘main’:
c.c:5: warning: incompatible implicit declaration of built-in function ‘printf’
zdo@mamburu:/tmp$ ./a.out 
1718969195 s=kcuf

Кстати, на винде это же под vs2008 выдает такой-же результат.

Да, в дампах можно видеть строку, а не число, однако, строка ведь получается обратной => становится не той, которую присвоили. Так в чем профит?

bk_ ★★
() автор топика
Ответ на: комментарий от bk_

> Кстати, на винде это же под vs2008 выдает такой-же результат.

Хинт: твои винда и линукс работают в данном случае на одной архитектуре.

geekless ★★
()
Ответ на: комментарий от geekless

Implementation, а не arch defined.

Неужели винда и линукс используют одну и ту же реализацию компилятора?

bk_ ★★
() автор топика
Ответ на: комментарий от bk_

uint32_t value = 0xaabbccdd; тоже даст разный порядок байт на разных endianess. и чо? все ок, все живы.

waker ★★★★★
()

А почему польза для отладки должна быть? Может с точки зрения лучшей читабельности кода делается?

Loki13 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.