: GNU 확장을 사용하는 경우
/* Reentrant version of `strerror'.
There are 2 flavors of `strerror_r', GNU which returns the string
and may or may not use the supplied temporary buffer and POSIX one
which fills the string into the buffer.
To use the POSIX version, -D_XOPEN_SOURCE=600 or -D_POSIX_C_SOURCE=200112L
without -D_GNU_SOURCE is needed, otherwise the GNU version is
preferred. */
주에 그들을 설정,주의 (_GNU_SOURCE
) 마지막으로, 당신이 영향 (또는 전략적으로 그것을 정의를 해제) 할 헤더를 포함하기 전에. GNU 확장을 사용하지 않는다고해도 걱정할 필요가 없습니다.
일반적으로 GNU가 기본 동작에서 POSIX를 벗어나면 헤더에 몇 가지 주석이 표시되어 POSIX 동작을 얻는 방법을 나타냅니다. 그것도 (일반적으로) glibc 매뉴얼에 문서화되어 있지만, 그것이 항상 압축 된 man 페이지를 만드는 것은 아니다.
편집
이 간단한 테스트를 시도 : 뭔가 다른 발생하지 않는 한
#include <string.h>
#ifdef _GNU_SOURCE
#error "Something turned it on!"
#endif
또는 정의 _POSIX_C_SOURCE={version}
하면 더 직접적으로
#ifdef _GNU_SOURCE
#undef _GNU_SOURCE
#endif
#include <string.h>
을, 당신은은 POSIX 버전이 있어야합니다 GNU 버전이 선호됩니다.
내가 할 수있는 유일한 생각은 _GNU_SOURCE
입니다. 나는 이것이 당신의 커맨드 라인 플래그에 없다고 확신합니다, 당신은 그것을 보았을 것입니다. 포함 된 또 다른 라이브러리가 켜져있을 수 있습니다.
그게 내가 POSIX 구현을 선호한다고 요청할 때 확장 기능이 '까다로운'것이라는 의미였습니다.
는
뭔가 (부스트가하는 아닌지 내가 ++ 나 C를 할만큼 많은 C를 사용하지 않는, 회수 할 수 없습니다) _GNU_SOURCE
켠 경우, 당신은 아마 그것을 허용 할 편집 그렇게하려면. 명령 행에서 --undef "[macro]" -U[macro]
을 사용할 수 있습니다.그러나,이 라이브러리 코드는 다음과 같은 경우에 작동하지 않습니다
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <stdio.h>
#include <string.h>
#ifdef _GNU_SOURCE
#error "It didn't work"
#endif
int main(void)
{
return 0;
}
문제는이다, 코드가 실제로 string.h
포함하는 시간, 뭔가 다른 이미 확장 켜져 있고 그것을 포함하고있다. 경비원을 포함 시키면 당연히 두 번 포함시키지 못하게됩니다.
명시 적으로 _GNU_SOURCE
을 끄고 보다 먼저 string.h
을 포함하면 이외의 문자를 사용해보십시오. 이렇게하면 다른 라이브러리에서 해당 확장을 사용하지 못하게 할 수 있습니다. 그러나 이러한 라이브러리가 없으면 라이브러리가 작동하지 않을 수 있습니다. 일부 코드는 GNU의 동작을 '예상'하며 POSIX에 대한 대체를 포함하지 않습니다.
나는 asprintf()
없이는 작동하지 않는 라이브러리 코드와 비슷한 불만을 경험했습니다.
헤더 파일이나 파티 헤더가 없습니다. '_GNU_SOURCE'? – nos