Какой тип перечисления, значения которого выглядят как строки? - PullRequest
14 голосов
/ 14 февраля 2009

Я работаю с фреймворком Apple ScriptingBridge и сгенерировал заголовочный файл для iTunes, который содержит несколько enum с:

typedef enum {
    iTunesESrcLibrary = 'kLib',
    iTunesESrcIPod = 'kPod',
    iTunesESrcAudioCD = 'kACD',
    iTunesESrcMP3CD = 'kMCD',
    iTunesESrcDevice = 'kDev',
    iTunesESrcRadioTuner = 'kTun',
    iTunesESrcSharedLibrary = 'kShd',
    iTunesESrcUnknown = 'kUnk'
} iTunesESrc;

Насколько я понимаю, enum значения должны быть целочисленными, но это определение, кажется, нарушает это правило. Кроме того, кажется, что обработка этих enum значений как целых чисел (например, в NSPredicate) не дает правильных результатов.

Я добавил приведенное выше объявление enum в файл C с пустой функцией main, и оно скомпилировано с использованием i686-apple-darwin9-gcc-4.0.1. Таким образом, хотя эти типы enum могут не соответствовать стандарту C (как Параппа указывает ниже), они по крайней мере компилируются в некоторый тип с помощью gcc.

Итак, что это за тип и как я могу использовать его, например, в строке формата?

Ответы [ 4 ]

18 голосов
/ 14 февраля 2009

C99, TC3 гласит:

6.4.4.4 §2:

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

6.4.4.4 §10:

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

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


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

.

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

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

6 голосов
/ 14 февраля 2009

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

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

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

2 голосов
/ 14 февраля 2009

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

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

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

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

Если вы не исправите эти коды, у вас останется код, который может работать только на компьютерах PowerPC, независимо от отсутствия ошибок компилятора.

0 голосов
/ 14 февраля 2009

Это расширение Apple для C, которое В основном переводит эти перечисления в:

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

РЕДАКТИРОВАТЬ: Извините, по-видимому, это действительный C. Я только кажется, что они в коде Mac, так что ошибочно предположил, что это специфично для Apple.

...