Porque sizeof() se calcula después de ejecutar el preprocesador, por lo que la información no está disponible para #if
.
Los compiladores C se dividen lógicamente en dos fases, incluso si la mayoría de los compiladores modernos no los separan. Primero, la fuente es preprocesada. Esto implica trabajar y sustituir todos los condicionales del preprocesador (#if, #define, reemplazando palabras definidas con sus reemplazos). La fuente se pasa, procesa, al compilador. El preprocesador solo es mínimamente consciente de la estructura de C, no tiene ningún tipo de conocimiento, por lo que no puede manejar construcciones de compilación como sizeof().
Esto tiene b een preguntado muchas veces. Solo haz una búsqueda. Aquí hay una respuesta, por ejemplo, http://stackoverflow.com/questions/1717665/c-throwing-compilation-error-on-sizeof-comparison-in-preprocessor-if – AnT
Creo que estás buscando LISP o Scheme :) – leppie