tutorial resumen por las español claves capitulos argumentacion c cocoa enums scripting-bridge

resumen - ¿Cuál es el tipo de una enumeración cuyos valores parecen ser cadenas?



las claves de la argumentacion resumen por capitulos (4)

Estoy trabajando con el marco ScriptingBridge de Apple y he generado un archivo de encabezado para iTunes que contiene varias enum como esta:

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

Según entendí, los valores enum tenían que ser enteros, pero esta definición parece violar esa regla. Además, parece que tratar estos valores enum como enteros (en NSPredicate , por ejemplo) no hace lo correcto.

enum declaración enum arriba a un archivo C con una función main vacía, y compilé usando i686-apple-darwin9-gcc-4.0.1 . Entonces, aunque este tipo de enum pueden no ajustarse al estándar C (como señala Parappa a continuación), al menos están siendo compiladas por gcc.

Entonces, ¿qué es ese tipo y cómo puedo usarlo, por ejemplo, en una cadena de formato?


C99, TC3 dice:

6.4.4.4 §2:

Una constante de caracteres enteros es una secuencia de uno o más caracteres multibyte entre comillas simples, como en ''x''. [...]

6.4.4.4 §10:

Una constante de caracteres enteros tiene tipo int. El valor de una constante de caracteres enteros que contiene un solo carácter que se asigna a un carácter de ejecución de un solo byte es el valor numérico de la representación del carácter correlacionado interpretado como un entero. El valor de una constante de caracteres enteros que contiene más de un carácter (por ejemplo, ''ab'') o que contiene un carácter o secuencia de escape que no se correlaciona con un carácter de ejecución de un solo byte, está definido por la implementación. Si una constante de caracteres enteros contiene un único carácter o secuencia de escape, su valor es el que resulta cuando un objeto con tipo char cuyo valor es el del carácter único o secuencia de escape se convierte en tipo int.

En la mayoría de las implementaciones, es seguro usar constantes de caracteres enteros de hasta 4 caracteres de un byte. El valor real puede diferir entre los diferentes sistemas (endianness?) Sin embargo.

Esto ya está definido en el estándar ANSI-C89, sección 3.1.3.4:

Una constante de caracteres enteros es una secuencia de uno o más caracteres multibyte entre comillas simples, como en ''x'' o ''ab''. [...]

Una constante de caracteres enteros tiene tipo int. El valor de una constante de caracteres enteros que contiene un solo carácter que se asigna a un miembro del juego de caracteres de ejecución básico es el valor numérico de la representación del carácter correlacionado interpretado como un número entero. El valor de una constante de caracteres enteros que contiene más de un carácter, o que contiene un carácter o secuencia de escape no representada en el conjunto de caracteres de ejecución básica, está definido por la implementación. En particular, en una implementación en la que el tipo char tiene el mismo rango de valores que el signo char, la posición del bit de orden superior de una constante de caracteres enteros de un solo carácter se trata como un bit de signo.


Como ya se dijo, esos son enteros declarados usando constantes de caracteres.

Cuando se declara un número entero utilizando una constante de carácter de más de un carácter, es sensible al orden de bytes de la máquina para la que se desarrolló la constante. Como todas las API Mac originales estaban en PPC o máquinas anteriores, están rezagadas con respecto a las máquinas Intel Little-Endian .

Si solo está construyendo para Intel, puede simplemente invertir el orden a mano.

Si está construyendo un binario universal, necesita usar una función de volteo como CFSwapInt32BigToHost .

Si no corrige esos códigos, obtendrá un código que solo podría funcionar en máquinas PowerPC, independientemente de la falta de errores del compilador.


Las comillas simples indican caracteres, en lugar de cadenas en C. Por lo tanto, cada una de las enumeraciones tendrá un valor de 32 bits que constará de los códigos de los caracteres de los cuatro caracteres. El valor real dependerá de las codificaciones de caracteres, pero asumo caracteres de 8 bits. Tenga en cuenta que no hay / A agregado.

Puede usar las enumeraciones para propósitos normales de comparación / asignación. Como con cualquier enumeración, el tipo subyacente es entero.

He usado esta técnica en sistemas integrados muchas veces para crear 4 ''nombres'' de caracteres que fueran legibles por el ser humano en contextos de volcado hexadecimal / depurador.


Esa es una extensión de Apple a C, que básicamente traduce esas enumeraciones a:

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

EDITAR: Lo siento, aparentemente es válido C. Solo los he visto en código de Mac, así que supuse erróneamente que era específico de Apple.