Да, есть трюк, который вам не хватает: вы можете использовать -std=gnu99
вместо -std=c99
.
-std=c99
#define
s __STRICT_ANSI__
, что /usr/include/features.h
интерпретируется как «по умолчанию ничего не включать за пределами стандарта C» (без него вы получаете как минимум _SVID_SOURCE
и _BSD_SOURCE
). -std=gnu99
, с другой стороны, означает «расширения C99 плюс GNU» (по умолчанию gcc в настоящее время -std=gnu89
, его эквивалент C89, поэтому вам нужно было указать что-то, чтобы получить новые функции C99).
В качестве альтернативы вы можете включить макросы тестирования функций (как указано в ответе @ litb). Глядя на /usr/include/stdlib.h
в моей системе, он ожидает один из __USE_SVID
, __USE_XOPEN_EXTENDED
или __USE_BSD
. /usr/include/features.h
говорит мне, что макросы функциональных тестов, которые бы включили их:
_SVID_SOURCE
(включает __USE_SVID
)
_BSD_SOURCE
(включает __USE_BSD
)
_XOPEN_SOURCE
со значением не менее 500
(включает __USE_XOPEN_EXTENDED
)
_XOPEN_SOURCE_EXTENDED
(также включает __USE_XOPEN_EXTENDED
)
_GNU_SOURCE
(включает все, включая четыре макроса функциональных тестов выше)
Для новых программ, в которых вы не слишком озабочены потенциальными конфликтами имен с новыми функциями из будущих стандартов, рекомендуется использовать как -std=gnu99
, так и -D_GNU_SOURCE
. Он позволяет вам использовать все новые стандартные функции и расширения GNU, что в сочетании с каким-то резервным вариантом (например, тестирование функций в стиле autoconf
) дает наибольшую гибкость.
Ссылки: