값을 찾으려면 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
내부 파일의 형식 정의 는 다음과 같습니다 .
ptrdiff_t
max_align_t
size_t
wchar_t
답변1
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
; GCC는 파일 이름 없이는 언어를 컴파일하고 있음을 알 수 없으므로 언어를 c로 지정하려면 a가 필요합니다 -xc
).
그런데 동일한 옵션이 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
옵션까지 모든 후속 입력 파일에 적용됩니다.
답변2
-H
소스 코드를 컴파일할 때 플래그를 추가하고 출력을 확인하면 됩니다 stddef.h
.
gcc file.c -H
답변3
size_t
에 정의됨/usr/include/sys/types.h
실제 정의를 찾으려면 파일의 #include를 따라야 할 수도 있습니다.
stddef.h
파일의 유일한 고유 정의가 offsetof
매크로인 메타 포함 파일입니다.