2010-02-17 9 views
7

que tienen un código que utiliza campos de bits declara como sigue¿Campos de bits de tipo distinto de int?

typedef struct my{ 
    const char *name; 
    uint8_t is_alpha : 1; 
    uint8_t is_hwaccel : 1; 
    uint8_t x_chroma_shift; 
    uint8_t y_chroma_shift; 

} mystr; 

uint8_t se typedef'ed a unsigned char.

Construyendo el código en MS-VS 2008 utilizando esta campos de bits da una advertencia de la siguiente manera:

imgconvert.c(60) : warning C4214: nonstandard extension used : bit-field types other than int.
  1. ¿Hay algunos problemas/problemas potenciales en el uso de campos de bits del tipo que no sea int? ¿Por qué la advertencia?
  2. ¿Existen otros tipos de archivos de bits de tipo int que permiten la especificación del lenguaje C99 C?
+1

La advertencia es bastante autoexplicativa: __la extensión no estándar utilizada__; su código puede tener problemas de portabilidad. –

+0

@Mehrad: El uso de tipo int es útil desde aspectos de portabilidad solo si todos los objetivos/compiladores tienen el mismo tamaño de entrada. – goldenmean

+0

está escribiendo sobre bitfields aquí, su tamaño está especificado en el código. – AProgrammer

Respuesta

4

1] ¿Hay algún problema o posible problema al utilizar campos de bit de tipo distinto de int? ¿Por qué la advertencia?

Dado que los campos de bits son de bajo nivel, puede haber problemas de portabilidad si utiliza tipos no estándar. De ahí la advertencia: tenga en cuenta que sigue siendo una advertencia y no un error.

2] ¿Existen otros tipos de archivos de bits de tipo int permitidos por la especificación del lenguaje C99 C?

Desde el borrador de C99:

6.7.2.1 Estructura y especificadores de unión

4 Un campo de bits tendrá un tipo que es una versión calificado o no calificado de _Bool, firmado int, unsigned int, o algún otro tipo de definido por la implementación.

+7

¿No es "algún otro tipo definido por la implementación" notablemente inútil en un documento de estándares? –

+0

@Neil Butterworth: ATM, solo tengo el borrador. Sin embargo, tendrá que buscar el real. Pero, sí, creo que tienes razón. – dirkgently

+0

@dirkgently: Usar type int es útil desde aspectos de portabilidad solo si se garantiza que todos los targets/compiler tengan las mismas dimensiones. Es esta una suposición razonable. No sé por qué estoy preguntando. – goldenmean

1

¿Por qué no utilizar int? La implementación real de los campos de bit varía de compilador a compilador. Si desea escribir código portátil, use int. Si desea crear una estructura pequeña, o una estructura de un número fijo de bytes, o una estructura donde los bits están en una posición fija, no use campos de bit. Cree un miembro uint8_t llamado algo así como flags y defina macros para usar como máscaras de bits.

+0

Quiere decir 'unsigned int'. 'uint8_t' no tiene firma,' int' está firmado, mezclarlos no es bueno. – kennytm

+0

No he usado bitfields personalmente en el código, pero si se trata de un bitfield de 1 bit, ¿el signo es importante? – tomlogic

Cuestiones relacionadas