glibc에서 참조되는 __USE_MISC는 어떻게 작동하나요?

glibc에서 참조되는 __USE_MISC는 어떻게 작동하나요?

__USE_MISC나는 그것이 어떻게 작동하고 어디에 문서화되어 있는지 알고 싶습니다 . 파일 내에서 .h이를 필요로 하고 언급하는 많은 기능을 볼 수 있습니다. 하지만 뭔가가 그것을 적극적으로 정의하고 있는 것 같은데, 무엇이 이것을 하고 있고 어떻게 결정을 내리는지 알고 싶습니다.

#define __USE_MISC 1
#include <stdio.h>

int main()
{
  printf("%d\n", __USE_MISC);
}

상품을 반품하다

__USE_MISC오류: 선언되지 않은 식별자 " " 을(를) 사용했습니다 .

_USE_MISC또는 또는 와 같이 다른 이름으로 부르면 USE_MISC오류가 사라집니다 foobar.

나는 clang과 gcc를 사용해 보았습니다.

답변1

이러한 매크로는 사용자가 정의하거나 확인해서는 안 되며, __USE_*glibc 헤더에 기능 선택기( 등) _XOPEN_SOURCE를 구현하는 메커니즘입니다 _GNU_SOURCE.

전체 메커니즘은 주석에 문서화되어 있습니다.features.h머리글.

features.h헤더는 대부분의 표준 헤더(예: from stdio.h)에 포함되어 있으며 가장 먼저 수행하는 작업은 모든 매크로를 정의 해제 한 다음 __USE_*사용자 정의 매크로 등을 기반으로 _POSIX_C_SOURCE선택적으로 정의하는 것입니다 . _GNU_SOURCE그런 다음 표준 헤더는 이러한 매크로를 기반으로 콘텐츠를 ifdef합니다 __USE_*.

__USE_*매크로에서 매크로를 여는 매크로로 다시 매핑하는 방법을 알고 싶을 수도 있습니다 _*_SOURCE. 예를 들어 프로그램을 으로 컴파일하고 함수가 열릴 때만 정의되는지 gcc -ansi확인 하고 어떤 선택기가 그 기능을 얻으세요. 다음은 다양한 선택기로 실행되는 스크립트에 의해 생성된 테이블 입니다 .psignal()__USE_XOPEN2K8_*_SOURCEgcc -ansi -E -dM "-D$source" -include features.h

__USE_ATFILE
        _ATFILE_SOURCE  _DEFAULT_SOURCE  _GNU_SOURCE
        _POSIX_C_SOURCE>=200809L  _XOPEN_SOURCE>=700
__USE_FILE_OFFSET64
        _FILE_OFFSET_BITS>=64
__USE_GNU
        _GNU_SOURCE
__USE_ISOC11
        _GNU_SOURCE  _ISOC11_SOURCE
__USE_ISOC95
        _DEFAULT_SOURCE  _GNU_SOURCE  _ISOC11_SOURCE  _ISOC99_SOURCE
        _POSIX_C_SOURCE>=200112L  _XOPEN_SOURCE>=600
__USE_ISOC99
        _DEFAULT_SOURCE  _GNU_SOURCE  _ISOC11_SOURCE  _ISOC99_SOURCE
        _POSIX_C_SOURCE>=200112L  _XOPEN_SOURCE>=600
__USE_LARGEFILE
        _GNU_SOURCE  _LARGEFILE_SOURCE  _XOPEN_SOURCE>=500
__USE_LARGEFILE64
        _GNU_SOURCE  _LARGEFILE64_SOURCE
__USE_MISC
        _DEFAULT_SOURCE  _GNU_SOURCE
__USE_POSIX
        _DEFAULT_SOURCE  _GNU_SOURCE  _POSIX_C_SOURCE  _POSIX_SOURCE
        _XOPEN_SOURCE>=500
__USE_POSIX199309
        _DEFAULT_SOURCE  _GNU_SOURCE  _POSIX_C_SOURCE>=199309L
        _XOPEN_SOURCE>=500
__USE_POSIX199506
        _DEFAULT_SOURCE  _GNU_SOURCE  _POSIX_C_SOURCE>=199506L
        _XOPEN_SOURCE>=500
__USE_POSIX2
        _DEFAULT_SOURCE  _GNU_SOURCE  _POSIX_C_SOURCE>=2
        _XOPEN_SOURCE>=500
__USE_POSIX_IMPLICITLY
        _DEFAULT_SOURCE  _XOPEN_SOURCE>=500
__USE_REENTRANT
        _REENTRANT  _THREAD_SAFE
__USE_UNIX98
        _GNU_SOURCE  _XOPEN_SOURCE>=500
__USE_XOPEN
        _GNU_SOURCE  _XOPEN_SOURCE>=500
__USE_XOPEN2K
        _DEFAULT_SOURCE  _GNU_SOURCE  _POSIX_C_SOURCE>=200112L
        _XOPEN_SOURCE>=600
__USE_XOPEN2K8
        _DEFAULT_SOURCE  _GNU_SOURCE  _POSIX_C_SOURCE>=200809L
        _XOPEN_SOURCE>=700
__USE_XOPEN2K8XSI
        _GNU_SOURCE  _XOPEN_SOURCE>=700
__USE_XOPEN2KXSI
        _GNU_SOURCE  _XOPEN_SOURCE>=600
__USE_XOPEN_EXTENDED
        _GNU_SOURCE  _XOPEN_SOURCE>=500

관련 정보