Каков тип перечисления, значения которого, кажется, строки?

В одну сторону:

awk -F, '($1 in a){x=a[$1];len=split(x,arr,",");arr[6]=arr[6]"%%% "$6;y=arr[1];arr[10]=arr[10]"%%% "$10;for(i=2;i<=len;i++){y=y","arr[i];a[$1]=y;}next;}{a[$1]=[110];}END{for(i in a){print a[i];}}' file
14
задан Gavin Brock 12 April 2010 в 09:43
поделиться

4 ответа

C99, чтения TC3:

6.4.4.4 §2:

Целочисленная символьная константа является последовательностью одного или нескольких многобайтовых символов, включенных в одинарные кавычки, как в 'x'. [...]

6.4.4.4 §10:

Целочисленная символьная константа имеет интервал типа. Значение целочисленной символьной константы, содержащей отдельный символ, который отображается на однобайтовый символ выполнения, является численным значением представления отображенного символа, интерпретируемого как целое число. Значение целочисленной символьной константы, содержащей больше чем один символ (например, 'ab'), или содержащей последовательность символов или escape-последовательность, которая не отображается на однобайтовый символ выполнения, определяется реализацией. Если целочисленная символьная константа содержит отдельный символ или escape-последовательность, ее значение является тем, которое заканчивается, когда объект с символом типа, значение которого является значением отдельного символа или escape-последовательности преобразовывается для ввода интервала.

В большинстве реализаций безопасно использовать целочисленные символьные константы до 4 однобайтовых символов. Фактическое значение могло бы отличаться между различными системами (порядок байтов?) все же.


Это на самом деле уже определяется в стандарте ANSI-C89, разделите 3.1.3.4:

Целочисленная символьная константа является последовательностью одного или нескольких многобайтовых символов, включенных в одинарные кавычки, как в 'x' или 'ab'. [...]

Целочисленная символьная константа имеет интервал типа. Значение целочисленной символьной константы, содержащей отдельный символ, который отображается в члена основного набора символов выполнения, является численным значением представления отображенного символа, интерпретируемого как целое число. Значение целочисленной символьной константы, содержащей больше чем один символ или содержащей последовательность символов или escape-последовательность, не представленную в основном наборе символов выполнения, определяется реализацией. В частности, в реализации, в которой символ типа имеет тот же диапазон значений как символ со знаком, старшую позицию двоичного разряда односимвольной целочисленной символьной константы рассматривают как знаковый бит.

18
ответ дан 1 December 2019 в 10:19
поделиться

Это - расширение Apple C, в который Оно в основном переводит те перечисления:

typedef enum {
    iTunesESrcLibrary = 'k'<<24 | 'L'<<16 | 'i'<<8 | 'b',
 ...
 }

Править: Извините, по-видимому, это - допустимый C. Я имею, только кажутся ими в коде Mac, так неправильно предположил, что это была конкретная Apple.

0
ответ дан 1 December 2019 в 10:19
поделиться

Как уже указано, это - целые числа, объявленные с помощью символьных констант.

Когда целое число объявляется с помощью символьной константы больше чем одного символа, это чувствительно к порядку байтов машины, для которой была разработана константа. Поскольку все исходные API Mac были на PPC или более ранних машинах, они назад относительно машин Intel Little-Endian.

Если Вы только создаете для Intel, можно просто инвертировать порядок вручную.

При создании Универсального двоичного файла, необходимо использовать функцию зеркального отражения, такую как CFSwapInt32BigToHost.

Отказ исправить те коды оставит Вас с кодом, который мог только работать над машинами PowerPC, независимо от отсутствия ошибок компилятора.

2
ответ дан 1 December 2019 в 10:19
поделиться

Одинарные кавычки указывают на символы, а не строки в C. Таким образом, каждое из перечислений будет иметь 32 битовых значения, состоящие из кодов символов для этих четырех символов. Фактическое значение будет зависеть в кодировках символов, но я принимаю символы на 8 битов. Примечание там не добавлено \0.

Можно использовать перечисления в нормальных целях сравнения/присвоения. Как с любым перечислением базовый тип является целым числом.

Я использовал эту технику во встроенных системах много раз для создания 4 персонажей 'имена', которые были человекочитаемы в шестнадцатеричных контекстах дампа/отладчика.

6
ответ дан 1 December 2019 в 10:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: