Las respuestas existentes solo muestran cómo lograr el efecto de "aserciones en tiempo de compilación" basadas en el tamaño de un tipo. Eso puede satisfacer las necesidades del OP en este caso particular, pero hay otros casos en los que realmente necesita un preprocesador condicional basado en el tamaño de un tipo. He aquí cómo hacerlo:
Escribe un pequeño programa en C como:
/* you could call this sizeof_int.c if you like... */
#include <stdio.h>
/* 'int' is just an example, it could be any other type */
int main(void) { printf("%zd", sizeof(int); }
Compila eso. Escriba un script en su lenguaje de script favorito, que ejecute el programa C anterior y capture su salida. Utilice esa salida para generar un archivo de encabezado C. Por ejemplo, si estuviera usando Ruby, podría verse así:
sizeof_int = `./sizeof_int`
File.open('include/sizes.h','w') { |f| f.write(<<HEADER) }
/* COMPUTER-GENERATED, DO NOT EDIT BY HAND! */
#define SIZEOF_INT #{sizeof_int}
/* others can go here... */
HEADER
Luego agregue una regla a su Makefile u otro script de compilación, lo que hará que ejecute el script anterior para compilar sizes.h.
Incluya sizes.hsiempre que necesite utilizar condicionales de preprocesador según los tamaños.
¡Hecho!
(¿Alguna vez ha escrito ./configure && makepara crear un programa? Lo que configurehacen los scripts es básicamente como el anterior ...)