Linux
Linux 中的 stddef.h 定義在哪裡?
如果我想找到 的值
stddef.h
,它在哪裡定義?/usr/include/linux/stddef.h
幾乎一無所有,/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ #ifndef __always_inline #define __always_inline __inline__ #endif
具體來說,我想看看
size_t
是怎麼定義的?幾個月後回到同樣的問題,想知道如何
whcar_t
定義。請注意,內部
stddef.h
文件的 typedef 為 ,
ptrdiff_t
max_align_t
size_t
wchar_t
C 標準不區分編譯器功能和庫功能。區別在於實現細節,可能因平台而異,但有共同的趨勢。例如基本整數類型的大小,
size_t
以及相關的宏,例如CHAR_BIT
和SIZE_MAX
是編譯器和編譯器選項的屬性;另一方面,其內容stdio.h
通常獨立於編譯器,但取決於標準庫如何實現文件。
stddef.h
主要是聲明編譯器的東西,所以它帶有編譯器。例如,如果在 32 位或 64 位模式下編譯,您最好獲得不同的定義,並且您將獲得不同的定義,例如 GCC 和 Clang。所以在編譯器目錄中尋找它。一些編譯器甚至根本沒有磁碟文件,他們只是<stddef.h>
特別對待名稱,但是使用 GCC 和 Clang 你確實得到了一個磁碟文件。您可以使用該
locate
命令找到系統上的所有副本。如果您想知道在給定特定選項時GCC 使用什麼包含路徑
-v
,請在命令行上傳遞該選項以及您在建構中使用的其他選項(尤其是-m
)。如果您只需要此資訊而不編譯任何內容,請在僅預處理器模式下使用空輸入呼叫 GCC(
-xc -E /dev/null
;您需要 a-xc
來指定語言為 c,因為 GCC 無法在沒有文件名的情況下判斷您正在編譯的語言)。順便說一句,相同的選項適用於 Clang。
gcc -v -xc -E /dev/null 2>&1 | awk ' /^End of search list/ {exit} p {print} /^#include <\.\.\.> search starts here:/ {p=1}' | xargs sh -c 'for x; do if [ -e "$x/stddef.h" ]; then echo "$x/stddef.h"; exit; fi; done' sh
如果您只想知道 的定義
size_t
,那麼您無需知道它的來源。要求編譯器列印預處理器的輸出。echo '#include <stddef.h>' | gcc -xc -E - | grep size_t
從
man gcc
,
-E
預處理階段後停止;不要正確執行編譯器。輸出採用預處理原始碼的形式,發送到標準輸出。不需要預處理的輸入文件將被忽略。-x language
明確指定以下輸入文件的語言(而不是讓編譯器根據文件名後綴選擇預設語言)。此選項適用於所有後續輸入文件,直到下一個-x
選項。