sourcecode

-D_DEFAULT_SOUR는 무엇을 합니까?

codebag 2023. 9. 25. 22:37
반응형

-D_DEFAULT_SOUR는 무엇을 합니까?

이전에 나는 다음으로부터 경고를 받고 있었습니다.gcc -std=c99그거usleep()은연중에 선언되었습니다.그러다 우연히 이 스택 오버플로우 게시물을 발견하고는-D_BSD_SOURCE. 하지만 지금은gcc라고 말해줍니다.-D_BSD_SOURCE사용하지 않을 것입니다.-D_DEFAULT_SOURCE대신.

#warning "_BSD_SOURCE and _SVID_SOURCE are deprecated, use _DEFAULT_SOURCE"

왜가.-D_BSD_SOURCE감가상각?왜가.-D_DEFAULT_SOURCE대신 사용?그게 무슨 역할을 하죠?

구글 검색을 좀 해봤는데, 결과는 그냥 닫으려고 사용하는 사람들로 가득 차 있어요.gcc위에. 왜 그 이유를 알 수가 없었습니다. -D_BSD_SOURCE감가상각이 되었습니다. 다만 그렇습니다.

glibc 매뉴얼은 다음을 포함한 각 피쳐 테스트 매크로(FTM)를 설명합니다._DEFAULT_SOURCE:

이 매크로를 정의하면 X/Open, LFS 및 GNU 확장과는 별개로 대부분의 기능이 포함됩니다. 이는 2008년판 POSIX의 기능뿐만 아니라 이를 제어하기 위한 별도의 기능 테스트 매크로 없이 특정 BSD 및 SVID 기능을 활성화하는 효과가 있습니다.다음과 같은 컴파일러 옵션을 사용하지 않고 자체적으로 매크로 정의-ansi아니면-std=c99, 기능 테스트 매크로를 정의하지 않는 것과 동일한 효과가 있습니다. 다른 기능 테스트 매크로와 함께 정의하거나 다음과 같은 옵션이 있는 경우-ansi를 사용하면 다른 옵션을 사용하지 않을 경우에도 해당 기능을 사용할 수 있습니다.

FTM에 관한 이 LWN.net 기사는 (다른 흥미로운 정보 중에서도) 다음과 같은 근거를 제공합니다.

원래 의도는 FTM을 사용하는 각각의 glibc 헤더 파일 내에서 오직 하나의__USE_*내부 매크로는 특정 정의의 노출을 관리해야 합니다.또한 매크로는 중첩된 상태에서 사용해서는 안 됩니다.#ifdef훈령glibc 헤더 파일을 검사한 결과 현실은 의도와 거리가 멀다는 것을 알 수 있었습니다. 이 상황은 롤랜드 맥그래스가 사태를 의도된 상황으로 되돌리기 위해 대대적인 정리가 필요한 시점이라는 것을 암시했습니다.롤랜드는 작업이 단순화 될 수 있다고 생각했습니다._BSD_SOURCE그리고._SVID_SOURCE역사적으로 목적이 있었지만, 요즘은 더 이상 쓸모가 없습니다.그는 현대 소스 코드에 필요한 매크로는 공식 표준과 관련된 매크로뿐이라고 말했습니다._GNU_SOURCE.

Joseph Myers는 이 작업의 첫 번째 단계를 구현하기 위해 일련의 패치를 당연히 사용해야 했습니다.Roland에 의해 장려된 보수적인 접근은 그것의 가치 하락을 의미했습니다._BSD_SOURCE그리고._SVID_SOURCEFTM은 두 개의 glibc 버전에 걸쳐 수행됩니다.glibc전 2.19운 ftm했습니다를 했습니다._DEFAULT_SOURCE이 하면 다른 때에도 이 매크로를 정의하면 다른 매크로의 명시적인 정의로 인해 기본 정의가 발생하지 않을 경우에도 기본 정의가 노출됩니다.전 glibc다라는 세 .

cc -D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_C_SOURCE=200809C

그래서 만약 당신이 정의를 내릴 필요가 있다면_BSD_SOURCE아니면_SVID_SOURCE, 간단히 정의를 내리다_DEFAULT_SOURCE= 않고 = 는 둘 다 정의되어 있으면 glibc전 = 2.18전 = 2.19다.

저는 리눅스를 넘어 glibc를 넘어서는 휴대성이 필요하고 #ifdef's를 싫어합니다. 그래서:

/* asprintf() does not appear on linux without this */
#define _GNU_SOURCE

/* gettimeofday() does not appear on linux without this. */
#define _BSD_SOURCE

/* modern glibc will complain about the above if it doesn't see this. */
#define _DEFAULT_SOURCE

언급URL : https://stackoverflow.com/questions/29201515/what-does-d-default-source-do

반응형