Questo file di intestazione deve definire NULL
o size_t
e altre macro, ma trovo che /usr/include/linux/stddef.h
è vuoto? Perché?Perché /usr/include/linux/stddef.h è vuoto?
risposta
La posizione effettiva delle intestazioni è definita dall'implementazione. Quello che guardi non è il tipico <stddef.h>
incluso da gcc. È possibile sapere esattamente dove si trova il vostro sistema con:
gcc -E - <<<'#include<stddef.h>' | grep stddef.h
che equivale ad includere l'intestazione <stddef.h>
in un file C vuoto e funzionante gcc -E
su di esso.
Le intestazioni in /usr/include/linux
vengono utilizzate per compilare la libreria C (in genere glibc su Linux). Il GNU manual dice:
Il Linux, asm e ASM-generic directory sono tenuti a compilare i programmi che utilizzano la libreria GNU C; le altre directory descrivono interfacce al kernel ma non sono necessarie se non sono compilazione di programmi che utilizzano tali interfacce. Non è necessario copiare le intestazioni del kernel se non si specifica un'intestazione del kernel alternativa utilizzando '--with-headers'.
mentre le intestazioni di libreria C in genere sono posizionate da qualche parte in /usr/lib/
. Sulla mia ubuntu 15.04, l'intestazione /usr/include/linux/stddef.h
è vuota. Ma sul mio CentOS, ha:
#ifndef _LINUX_STDDEF_H
#define _LINUX_STDDEF_H
#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
La linea di fondo è, questo non è il stddef.h
che ti interessa e, in generale, non si dovrebbe fare alcuna ipotesi circa la posizione dei file di intestazione standard.
fa '- <<<' è una sintassi specifica per 'gcc', cioè non è valida nella shell – zhy
@zhy' -' è qualcosa che gcc capisce. Significa "leggere l'input dallo standard input". OTOH, '<<<' è specifico per bash (che è la shell di default sulla maggior parte delle distribuzioni Linux), chiamato come "here strings". Se '<<<' non è disponibile, puoi scrivere lo stesso di: 'echo '#include
Capisco ora. '<<<' significa una stringa qui, '<<' è un documento qui. Grazie! – zhy
http://clang.llvm.org/doxygen/stddef_8h_source.html – moffeltje
Nominalmente, si include '/ usr/include/stddef.h' quando si scrive' #include '. Quello che fa è fino all'implementazione. Forse non c'è nulla di necessario nell'intestazione 'linux/stddef.h' - quella standard, o un'intestazione inclusa da un'altra sottodirectory, contiene tutto ciò che è necessario. –