Каков тип перечисления, значения которого представляют собой строки?
Я работаю с инфраструктурой 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.
Итак, что это за тип и как его использовать, например, в строке формата?
Ответы
Ответ 1
C99, TC3 читает:
6.4.4.4 §2:
Целочисленная символьная константа представляет собой последовательность одного или нескольких многобайтовых символов, заключенных в одиночные кавычки, как в 'x'. [...]
6.4.4.4 §10:
Целочисленная символьная константа имеет тип int. Значение целочисленной символьной константы, содержащей один символ, который сопоставляется однобайтовому символу выполнения, представляет собой числовое значение представления отображаемого символа, интерпретируемого как целое число. Значение целочисленной символьной константы, содержащей более одного символа (например, "ab" ) или содержащее символ или escape-последовательность, которая не отображается на однобайтовый символ исполнения, определяется реализацией. Если целочисленная символьная константа содержит одиночный символ или escape-последовательность, то это значение получается тогда, когда объект с типом char, значением которого является один символ или escape-последовательность, преобразуется в тип int.
В большинстве реализаций безопасно использовать целочисленные символьные константы длиной до 4 однобайтовых символов. Фактическое значение может отличаться для разных систем (endianness?), Хотя.
Это фактически уже определено в стандарте ANSI-C89, раздел 3.1.3.4:
Целочисленная символьная константа представляет собой последовательность одного или нескольких многобайтные символы, заключенные в одиночные кавычки, как в 'x' или 'ab'. [...]
Целочисленная символьная константа имеет тип int. Значение целочисленная символьная константа, содержащая единственный символ, который отображает в элемент основного набора символов выполнения, является числовым значение представления отображаемого символа, интерпретируемого как целое число. Значение целочисленной символьной константы, содержащей больше чем один символ, или содержащий символ или escape-последовательность, а не представленный в базовом наборе символов выполнения, является реализации. В частности, в реализации, в которой тип char имеет тот же диапазон значений, что и подписанный char, высокий порядок битовая позиция односимвольной целочисленной символьной константы обрабатывается как знаковый бит.
Ответ 2
Одиночные кавычки указывают символы, а не строки в C. Таким образом, каждый из перечислений будет иметь 32-битное значение, состоящее из кодов символов для четырех символов. Фактическое значение будет зависеть от кодировки символов, но я принимаю 8-битные символы. Заметьте, что не добавлено \0.
Вы можете использовать перечисления для обычных целей сравнения/назначения. Как и при любом перечислении, базовый тип является целым числом.
Я использовал эту технику во встроенных системах много раз, чтобы создать 4 символьные "имена", которые были доступны для чтения в контексте hex dump/debugger.
Ответ 3
Как уже говорилось, это объявленные целые числа с использованием символьных констант.
Когда целое число объявляется с использованием символьной константы более одного символа, оно чувствительно к порядку байта Little-Endian.
Если вы строите только Intel, вы можете просто отменить заказ вручную.
Если вы создаете универсальный двоичный файл, вам нужно использовать функцию flipping, такую как CFSwapInt32BigToHost.
Несоблюдение этих кодов оставит вас кодом, который может работать только на машинах PowerPC, независимо от отсутствия ошибок компилятора.
Ответ 4
Это расширение Apple для C, которое Оно в основном переводит эти перечисления на:
typedef enum {
iTunesESrcLibrary = 'k'<<24 | 'L'<<16 | 'i'<<8 | 'b',
...
}
EDIT: Извините, по-видимому, это действительно C. Я только кажусь им в коде Mac, поэтому ошибочно полагаю, что это был Apple.