[c] -D_XOPEN_SOURCE의 기능 / 의미는 무엇입니까?

최근에이 인수 없이는 gcc가 컴파일 할 수없는 코드를 발견했습니다. gcc man 페이지를 확인했지만이 특정 옵션을 찾지 못했습니다. 을 찾았 XOPEN_SOURCE지만 그 기능에 대한 설명이 거의 없었습니다.

누군가 자세히 설명해 주시겠습니까? 내가 알고 -D_XOPEN_SOURCE다른 값 등으로 설정할 수 있습니다 400, 600그 할 일을 일을하지만?



답변

당신이 할 때

#define _XOPEN_SOURCE <some number>

또는

cc -D_XOPEN_SOURCE=<some number>

X / Open 및 POSIX 표준에 정의 된 일부 추가 함수에 대한 정의를 포함하도록 컴파일러에 지시합니다.

이렇게하면 최신 UNIX / BSD / Linux 시스템에 존재하지만 Windows와 같은 다른 시스템에는 존재하지 않는 몇 가지 추가 기능이 제공됩니다.

숫자는 다른 버전의 표준을 나타냅니다.

호출하는 각 함수의 맨 페이지를 보면 필요한 것이 무엇인지 알 수 있습니다.

예를 들면 다음과 man strdup같습니다.

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       strdup(): _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500
       strndup(), strdupa(), strndupa(): _GNU_SOURCE

즉, 다음 중 하나를 입력해야합니다.

#define _SVID_SOURCE
#define _BSD_SOURCE
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 600
#define _XOPEN_SOURCE 700

#include를 사용하려면 s 를 수행하기 전에 소스 파일의 맨 위에 있습니다 strdup.

또는 당신은 넣을 수 있습니다

#define _GNU_SOURCE

대신 Solaris, FreeBSD, Mac OS X 등에서 컴파일되지 않을 수 있다는 단점과 함께 모든 기능을 활성화합니다.

#include, 를 수행 #define하거나 새 함수를 사용 하기 전에 각 매뉴얼 페이지를 확인하는 것이 좋습니다. #define예를 들어 basename (3) 과 같이 옵션과 옵션에 따라 동작이 변경되기도합니다 .

또한보십시오:


답변

-D전 처리기 변수를 정의하는 ac 컴파일러 옵션입니다. 이 경우 _XOPEN_SOURCE.

이것은 실제로 컴파일러 자체의 동작에 영향을주지 않고 표준 c 라이브러리와 같은 일부 라이브러리의 동작 방식을 변경합니다. 이와 같은 몇 가지 옵션이 있습니다. 대부분의 경우 일부 UNIX 특정 프로그래밍 인터페이스 또는 일부 특정 라이브러리 공급 업체에 대한 표준 문서와 관련이 있습니다.

일부 표준 기능의 동작이나 심지어 그 시그니처도 표준간에 다를 수 있으므로 이들 중 하나를 정의해야하는 경우가 있습니다. 따라서 -D_XOPEN_SOURCE호환 모드를 켜 려면 또는 이와 유사한 것을 사용해야 할 수 있습니다 .

이러한 플래그의 또 다른 가능한 사용법은 C 라이브러리 구현에서 제공하는 확장을 전환하여 소스 코드가 특정 표준의 한계 내에서 유지되도록하는 것입니다. 이것은 코드가 가능한 한 많은 플랫폼에서 실행되도록하는 데 사용할 수있는 조치 중 하나입니다.


답변

이것은 posix와 같은 주어진 규범의 정의에 속하는 헤더를 노출합니다. 그것이 속하는 실제 규범은 값으로 정의됩니다 (예를 들어 400 또는 600). 표준 / 값 바인딩에 대해서는이 참조 를 참조하십시오 .


답변

알 수없는 이유로 Mac OS / X (XCode)는 1995 사양에 있지만 strdup ()을 정의하려면 600이 필요합니다. Mozilla와 다른 사람들 이 이것에 부딪 혔 습니다 …


답변