작업 중.

NAME

feature_test_macros - 기능 확인 매크로

DESCRIPTION

기능 확인 매크로를 이용하면 프로그램 컴파일 시 시스템 헤더 파일에 노출되는 정의들을 프로그래머가 제어할 수 있다.

주의: 기능 확인 매크로가 효과가 있으려면 헤더 파일 포함 전에 정의해야 한다. 컴파일 명령(cc -DMACRO=value)으로 정의하거나 소스 코드에서 헤더 파일을 포함시키기 전에 정의하면 된다. ....

#include <abc.h>
#define _GNU_SOURCE
#include <xyz.h>

....

....

매뉴얼 페이지 내의 기능 확인 매크로 요구 조건 명세

....

#include <unistd.h>

int acct(const char *filename);

glibc 기능 확인 매크로 요건 (feature_test_macros(7) 참고):

acct()
_BSD_SOURCE || (_XOPEN_SOURCE && _XOPEN_SOURCE < 500)

....

#define _BSD_SOURCE
#define _XOPEN_SOURCE        /* 또는 < 500 인 아무 값 */

....

cc -D_BSD_SOURCE
cc -D_XOPEN_SOURCE           # 또는 < 500 인 아무 값

....

....

#define _GNU_SOURCE
#include <fcntl.h>

ssize_t readahead(int fd, off64_t *offset, size_t count);

....

glibc에서 이해하는 기능 확인 매크로

....

....

....

....

__STRICT_ANSI__
....
_POSIX_C_SOURCE

....

  • ....
  • ....
  • ....
  • ....
  • ....
  • ....
_POSIX_SOURCE

....

....

_XOPEN_SOURCE

....

  • ....
  • ....
  • ....
  • ....

....

  • ....
  • ....

    _XOPEN_SOURCE < 500
    ....
    500 <= _XOPEN_SOURCE < 600
    ....
    600 <= _XOPEN_SOURCE < 700
    ....
    700 <= _XOPEN_SOURCE (glibc 2.10부터)
    ....

....

_XOPEN_SOURCE_EXTENDED

....

....

_ISOC99_SOURCE (glibc 2.1.3부터)

....

....

....

....

_ISOC11_SOURCE (glibc 2.16부터)

....

....

_LARGEFILE64_SOURCE
....
_LARGEFILE_SOURCE
....
_FILE_OFFSET_BITS

....

....

_BSD_SOURCE (glibc 2.20부터 제거 예정 상태)

....

....

....

_SVID_SOURCE (glibc 2.20부터 제거 예정 상태)

....

....

_DEFAULT_SOURCE (glibc 2.19부터)

....

....

cc -D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_C_SOURCE=200809
_ATFILE_SOURCE (glibc 2.4부터)
....
_GNU_SOURCE

....

....

_REENTRANT

....

....

....

....

_THREAD_SAFE
....
_FORTIFY_SOURCE (glibc 2.3.4부터)

....

....

....

....

기본 정의, 암묵적 정의, 결합 정의

....

....

....

....

CONFORMING TO

....

....

....

NOTES

....

....

EXAMPLES

....

$ cc ftm.c
$ ./a.out
_POSIX_SOURCE defined
_POSIX_C_SOURCE defined: 200809L
_BSD_SOURCE defined
_SVID_SOURCE defined
_ATFILE_SOURCE defined
$ cc -D_XOPEN_SOURCE=500 ftm.c
$ ./a.out
_POSIX_SOURCE defined
_POSIX_C_SOURCE defined: 199506L
_XOPEN_SOURCE defined: 500
$ cc -D_GNU_SOURCE ftm.c
$ ./a.out
_POSIX_SOURCE defined
_POSIX_C_SOURCE defined: 200809L
_ISOC99_SOURCE defined
_XOPEN_SOURCE defined: 700
_XOPEN_SOURCE_EXTENDED defined
_LARGEFILE64_SOURCE defined
_BSD_SOURCE defined
_SVID_SOURCE defined
_ATFILE_SOURCE defined
_GNU_SOURCE defined

프로그램 소스

/* ftm.c */

#include <stdint.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
#ifdef _POSIX_SOURCE
    printf("_POSIX_SOURCE defined\n");
#endif

#ifdef _POSIX_C_SOURCE
    printf("_POSIX_C_SOURCE defined: %jdL\n",
            (intmax_t) _POSIX_C_SOURCE);
#endif

#ifdef _ISOC99_SOURCE
    printf("_ISOC99_SOURCE defined\n");
#endif

#ifdef _ISOC11_SOURCE
    printf("_ISOC11_SOURCE defined\n");
#endif

#ifdef _XOPEN_SOURCE
    printf("_XOPEN_SOURCE defined: %d\n", _XOPEN_SOURCE);
#endif

#ifdef _XOPEN_SOURCE_EXTENDED
    printf("_XOPEN_SOURCE_EXTENDED defined\n");
#endif

#ifdef _LARGEFILE64_SOURCE
    printf("_LARGEFILE64_SOURCE defined\n");
#endif

#ifdef _FILE_OFFSET_BITS
    printf("_FILE_OFFSET_BITS defined: %d\n", _FILE_OFFSET_BITS);
#endif

#ifdef _BSD_SOURCE
    printf("_BSD_SOURCE defined\n");
#endif

#ifdef _SVID_SOURCE
    printf("_SVID_SOURCE defined\n");
#endif

#ifdef _DEFAULT_SOURCE
    printf("_DEFAULT_SOURCE defined\n");
#endif

#ifdef _ATFILE_SOURCE
    printf("_ATFILE_SOURCE defined\n");
#endif

#ifdef _GNU_SOURCE
    printf("_GNU_SOURCE defined\n");
#endif

#ifdef _REENTRANT
    printf("_REENTRANT defined\n");
#endif

#ifdef _THREAD_SAFE
    printf("_THREAD_SAFE defined\n");
#endif

#ifdef _FORTIFY_SOURCE
    printf("_FORTIFY_SOURCE defined\n");
#endif

    exit(EXIT_SUCCESS);
}

SEE ALSO

libc(7), standards(7), system_data_types(7)

info libc의 "Feature Test Macros" 절.

/usr/include/features.h


2021-03-22