Этот заголовочный файл должен определять NULL
или size_t
и другие макросы, но я обнаружил, что /usr/include/linux/stddef.h
пуст? Почему?
Почему/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
, вас интересует, и в целом вы не должны делать никаких предположений о расположении стандартных файлов заголовков.