Из заголовка string.h
:
/* 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, включайте их (_GNU_SOURCE
) в последнюю очередь, прежде чем включать заголовки, на которые вы хотите, чтобы они воздействовали (илиопределите это стратегически).Не беспокойтесь, если не используете расширения GNU.
Как правило, если GNU отклоняется от POSIX в поведении по умолчанию, вы увидите некоторые комментарии в заголовке, чтобы указать, как вы можете получить поведение POSIX.Это также (как правило) документировано в руководстве по glibc, но это не всегда относится к очень сжатым man-страницам.
Edit
Попробуйте этот простой тест:
#include <string.h>
#ifdef _GNU_SOURCE
#error "Something turned it on!"
#endif
Или, точнее,
#ifdef _GNU_SOURCE
#undef _GNU_SOURCE
#endif
#include <string.h>
Если определено _POSIX_C_SOURCE={version}
, у вас должна быть версия POSIX, если только что-то еще не вызвало предпочтение версии GNU..
Единственное, что я могу придумать, это сделать _GNU_SOURCE
.Я уверен, что это не на ваших флагах командной строки, вы бы видели это.Вполне возможно, что другая библиотека, которая включена, включила его.
Это то, что я имел в виду, что расширения были хитрыми при запросе поддержки реализаций POSIX, даже если вы не включили их..
Редактировать
Если что-то включается _GNU_SOURCE
(я не могу вспомнить, работает ли Boost или нет, я не использую с ++ почти так же, какЯ делаю C), вы, вероятно, хотите позволить это сделать.Вы можете использовать --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()
.