Uniones, campos de bits y comportamiento indefinido
13 pasos en 5 series de C.
Las partes de C que son legales, útiles y capaces de arruinarte la semana. Uniones y disposición de structs, const, volatile y restrict, y después una serie sobre el comportamiento indefinido en sí.
Desbordamiento con signo, strict aliasing, puntos de secuencia: cosas que funcionan hasta que el optimizador nota que tiene permiso de asumir que nunca ocurren. Trece pasos, y es el tour con más probabilidades de cambiar cómo lees las advertencias del compilador.
Uniones y disposición
- UnionesUn bloque de almacenamiento, varias interpretaciones — pero solo una válida a la vez.
- Una unión etiquetadaLa manera de C de escribir un tipo suma: un enum que dice qué miembro está vivo.
- BitfieldsMiembros de struct medidos en bits, para empacar flags y contadores chicos.
- offsetof y disposiciónoffsetof reporta dónde queda un miembro; así funcionan los contenedores intrusivos.
- Miembros de arreglo flexibleUn arreglo de largo desconocido como último miembro: una sola reserva para encabezado y datos.
Calificadores
Comportamiento indefinido
- Comportamiento indefinido: desbordamiento con signoEl desbordamiento con signo es indefinido: el compilador puede asumir que nunca pasa.
- Comportamiento indefinido: strict aliasingLeer un objeto a través de un tipo de puntero ajeno rompe la regla de aliasing.
- Más comportamiento indefinidoDesplazar de más, leer memoria sin inicializar, dividir entre cero — y sus guardas.
Válvulas de escape
- _GenericLa selección por tipo de C11: un nombre de macro, una llamada distinta por tipo.
- setjmp y longjmpUn salto no local a un punto guardado — lo más cercano a una excepción que tiene C.
Bis
- value_interp.cUna maquinita de pila sobre una unión etiquetada, con aritmética tipada.