Из заголовка 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, но это не всегда приводит к очень сжатым справочным страницам.
Изменить
Попробуйте этот простой тест:
#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++ почти так же часто, как 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()
.
person
Tim Post♦
schedule
16.06.2010
_GNU_SOURCE
? - person nos   schedule 16.06.2010