Este archivo de encabezado definirá NULL o size_t y otras macros, pero encuentro que /usr/include/linux/stddef.h está vacío. ¿Por qué?
La ubicación real de los encabezados está definida por la implementación. Lo que ves no es el típico <stddef.h> incluido por gcc. Puede averiguar exactamente dónde se encuentra en su sistema con:
gcc -E - <<<'#include<stddef.h>' | grep stddef.h lo que equivale a incluir el encabezado <stddef.h> en un archivo C vacío y ejecutar gcc -E en él.
Los encabezados en /usr/include/linux se usan para compilar la biblioteca C (generalmente glibc en Linux). El manual de GNU dice:
Los directorios linux , asm y asm-generic son necesarios para compilar programas utilizando la biblioteca GNU C; los otros directorios describen las interfaces del kernel, pero no son necesarios si no se compilan programas usando esas interfaces. No necesita copiar los encabezados del kernel si no especificó una fuente de encabezado del kernel alternativa usando '--with-headers'.
mientras que los encabezados de la biblioteca C generalmente se colocan en algún lugar de /usr/lib/ . En mi ubuntu 15.04, el encabezado /usr/include/linux/stddef.h está vacío. Pero en mi CentOS, tiene:
#ifndef _LINUX_STDDEF_H #define _LINUX_STDDEF_H #undef NULL #if defined(__cplusplus) #define NULL 0 #else #define NULL ((void *)0) #endif #endif La conclusión es que este NO es el stddef.h que le interesa y, en general, no debe hacer suposiciones sobre la ubicación de los archivos de encabezado estándar.