Почему/usr/include/linux/stddef.h пуст?

Этот заголовочный файл должен определять NULL или size_t и другие макросы, но я обнаружил, что /usr/include/linux/stddef.h пуст? Почему?

Ответ 1

Фактическое местоположение заголовков определяется реализацией. То, на что вы смотрите, не типичный <stddef.h>, включенный gcc. Вы можете узнать, где именно он находится в вашей системе, с помощью:

gcc -E - <<<'#include<stddef.h>' | grep stddef.h

что эквивалентно включению заголовка <stddef.h> в пустой файл C и запуск gcc -E на нем.

Заголовки в /usr/include/linux используются для компиляции библиотеки C (обычно glibc на Linux). В руководстве GNU говорится:

Каталоги linux, asm и asm-generic необходимы для компилировать программы, используя библиотеку GNU C; другие каталоги описать интерфейсы к ядру, но не требуются, если не компиляция программ с использованием этих интерфейсов. Вам не нужно копировать заголовки ядра, если вы не указали альтернативный заголовок ядра источник с использованием '--with-headers.

тогда как заголовки библиотеки C обычно помещаются где-то в /usr/lib/. На моем ubuntu 15.04 заголовок /usr/include/linux/stddef.h пуст. Но на моем CentOS он имеет:

#ifndef _LINUX_STDDEF_H
#define _LINUX_STDDEF_H

#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif

#endif

В нижней строке указано, что это НЕ stddef.h, вас интересует, и в целом вы не должны делать никаких предположений о расположении стандартных файлов заголовков.