質問: どのunistd.hファイルがロードされているかをどのようにして知ることができますか? 私はいくつか持っている unistd.h私のubuntu linuxのファイル。 /usr/include/asm/unistd.h。このファイルには次のディレクティブがあります。# ifdef __i386__ # include "unistd_32.h" # else # include "unistd_64.h" # endif そのフォルダーで、それらのファイル(unistd_32.hおよびunistd_64.h)。しかし、/usr/src/linux-headers-2.6.31-22/include/asm-generic/もう1つありますunistd.hこのディレクティブで始まります:#if !defined(_asm_generic_unistd_h) || defined(__syscall) #define _asm_generic_unistd_h それで、問題は、どのものがロードされているかをどのようにして知ることができますか? javaでランタイムにそれをチェックする方法はありますか?
回答: インクルードファイルを検索するためにgccコンパイラが従う正確なルールは、次の場所で説明されています http://gcc.gnu.org/onlinedocs/cpp/search-path.html インクルードファイルがどこから来たかを知るための簡単なコマンドライントリックは次のとおりです。1echo '#include <unistd.h>' | gcc -e -x c - > unistd.preprocessed 次に、unistd.preprocessedファイルを見ると、次のような行があることがわかります。# 1 "/usr/include/unistd.h" <some numbers> これらは、次の行のブロック(次の# number ...行まで)がファイル/usr/include/unistd.hからのものであることを示しています。したがって、含まれているファイルの完全なリストを知りたい場合は、# number行をgrepできます。echo '#include <unistd.h>' | gcc -e -x c - | egrep '# [0-9]+ ' | awk '{print $3;}' | sort -u*emphasized text* 私のubuntu 10.04/gcc 4.4.3システムでは、これは以下を生成します:$ echo '#include <unistd.h>' | gcc -e -x c - | 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 注:インクルードファイルの検索パスは、-iコマンドラインオプションによって変更されます。そのため、gcc呼び出しに-i path引数を追加する必要があります。また、c++ソースをコンパイルする場合は、-x cを-x c++に置き換える必要があります。