2015-07-08 11 views
10

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?

+0

http://clang.llvm.org/doxygen/stddef_8h_source.html – moffeltje

+2

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. –

risposta

11

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.

+0

fa '- <<<' è una sintassi specifica per 'gcc', cioè non è valida nella shell – zhy

+1

@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 ' | gcc -E - | grep stddef.h'. –

+0

Capisco ora. '<<<' significa una stringa qui, '<<' è un documento qui. Grazie! – zhy