Linux

Linux 中的 stddef.h 定義在哪裡?

  • September 1, 2018

如果我想找到 的值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_BITSIZE_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選項。

引用自:https://unix.stackexchange.com/questions/451232