Intereting Posts

Где в 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. Ищите это в каталогах компилятора. Некоторые компиляторы даже не имеют файла на диске вообще, они просто обрабатывают имя специально, но с GCC и Clang вы получаете файл на диске.

Вы можете найти все копии в вашей системе с помощью команды locate .

Если вы хотите узнать, какой путь включает в себя GCC при заданных параметрах, передайте параметр -v в командной строке в дополнение к другим параметрам, которые вы используете в своей сборке (особенно -m ).

Если вы просто хотите получить эту информацию, ничего не компилируя, вызовите GCC в режиме только препроцессора с пустым вводом ( -xc -E /dev/null ; вам нужно -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 ' | gcc -xc -E - | grep size_t 

От man gcc ,

  • -E остановка после этапа предварительной обработки; не запускайте компилятор должным образом. Выходные данные представлены в виде предварительно обработанного исходного кода, который отправляется на стандартный вывод. Входные файлы, которые не требуют предварительной обработки, игнорируются.
  • -x language Укажите явно язык для следующих входных файлов (вместо того, чтобы позволить компилятору выбирать значение по умолчанию на основе суффикса имени файла). Эта опция применяется ко всем следующим входным файлам до следующей опции -x .

size_t определяется в /usr/include/sys/types.h

Обратите внимание, что вам может потребоваться следовать #include из этого файла, чтобы найти реальное определение.

stddef.h – это просто файл мета-включения, и единственным уникальным определением в этом файле является макрос offsetof .