Son realmente sólo int
s.Se utilizan ampliamente en la API de Core Audio de enumeración por ejemplo, en el archivo CoreAudioTypes.h
cabecera,
enum
{
kAudioFormatLinearPCM = 'lpcm',
kAudioFormatAC3 = 'ac-3',
kAudioFormat60958AC3 = 'cac3',
kAudioFormatAppleIMA4 = 'ima4',
kAudioFormatMPEG4AAC = 'aac ',
kAudioFormatMPEG4CELP = 'celp',
} ;
Hay mucha charla sobre esto no ser "independiente de la plataforma", pero cuando se está utilizando una API que es hecho para una plataforma específica, que se preocupa por la portabilidad. Verificar la igualdad en la misma plataforma nunca fallará. Estos valores enum
'd son más fáciles de leer y en realidad contienen su identidad en su valor, lo cual es bastante agradable.
Lo que he tratado de hacer a continuación es envolver un carácter multibyte literal para que se pueda imprimir (en Mac esto funciona). Lo extraño es que, si no se utiliza encima de los 4 caracteres, el resultado se vuelve incorrecta a continuación ..
#include <stdio.h>
#define MASK(x,BYTEX) ((x&(0xff<<8*BYTEX))>>(8*BYTEX))
struct Multibyte
{
union{
int val ;
char vals[4];
};
Multibyte() : val(0) { }
Multibyte(int in)
{
vals[0] = MASK(in,3);
vals[1] = MASK(in,2);
vals[2] = MASK(in,1);
vals[3] = MASK(in,0);
}
char operator[](int i) {
return val >> (3-i)*8 ; // works on mac
//return val>>i*8 ; // might work on other systems
}
void println()
{
for(int i = 0 ; i < 4 ; i++)
putc(vals[i], stdout) ;
puts("") ;
}
} ;
int main(int argc, const char * argv[])
{
Multibyte('abcd').println() ;
Multibyte('x097').println() ;
Multibyte('\"\\\'\'').println() ;
Multibyte('/*|').println() ;
Multibyte('d').println() ;
return 0;
}
Niza primera cuestión en StackOverflow. –
Preste atención a que el valor real es la implementación definida http://stackoverflow.com/questions/3960954/c-multicharacter-literal – FireAphis
Niza última pregunta en StackOverflow. :( –