Comment puis-je savoir quel file unistd.h est chargé?

J'ai plusieurs files unistd.h dans mon Ubuntu Linux. J'en ai un sur /usr/include/asm/unistd.h . Ce file a ces directives:

 # ifdef __i386__ # include "unistd_32.h" # else # include "unistd_64.h" # endif 

Dans ce dossier, je peux find ces files ( unistd_32.h et unistd_64.h ).

Mais dans /usr/src/linux-headers-2.6.31-22/include/asm-generic/ il y a un autre unistd.h qui commence par ces directives:

 #if !defined(_ASM_GENERIC_UNISTD_H) || defined(__SYSCALL) #define _ASM_GENERIC_UNISTD_H 

Donc, la question est: Comment puis-je savoir lequel est chargé? Yat-il un moyen de vérifier dans le runtime avec Java?

Les règles exactes suivies par le compilateur gcc pour find les files include sont expliquées à: http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

Une astuce de command line rapide pour savoir d'où provient un file d'inclusion est la suivante: 1

 echo '#include <unistd.h>' | gcc -E -xc - > unistd.preprocessed 

Ensuite, si vous regardez le file unistd.preprocessed , vous remarquerez des lignes comme:

 # 1 "/usr/include/unistd.h" <some numbers> 

Ceux-ci vous indiquent que le bloc de lignes suivant (jusqu'au prochain # number ... ligne) provient du file /usr/include/unistd.h .

Donc, si vous voulez connaître la list complète des files inclus, vous pouvez grep pour les lignes # number :

 echo '#include <unistd.h>' | gcc -E -xc - | egrep '# [0-9]+ ' | awk '{print $3;}' | sort -u*emphasized text* 

Sur mon système Ubuntu 10.04 / gcc 4.4.3, cela produit:

 $ echo '#include <unistd.h>' | gcc -E -xc - | egrep '# [0-9]+ ' | awk '{print $3;}' | sort -u "<built-in>" "<command-line>" "<stdin>" "/usr/include/bits/confname.h" "/usr/include/bits/posix_opt.h" "/usr/include/bits/predefs.h" "/usr/include/bits/types.h" "/usr/include/bits/typesizes.h" "/usr/include/bits/wordsize.h" "/usr/include/features.h" "/usr/include/getopt.h" "/usr/include/gnu/stubs-64.h" "/usr/include/gnu/stubs.h" "/usr/include/sys/cdefs.h" "/usr/include/unistd.h" "/usr/lib/gcc/x86_64-linux-gnu/4.4.3/include/stddef.h" 

1 Remarque: Le path de search des files d'inclusion est modifié par l'option de command line -I ; Vous devez donc append les arguments de -I path à l'invocation gcc . En outre, si vous comstackz une source C ++, vous devez replace -xc par -x c++ .