Может -std = c99 помешать моим #include работать нормально?
Нет, но они могут показать ограничения в ваших знаниях о том, как они работают:-)
Хотя функции [sd]rand48
имеют прототип в stdlib.h
, они находятся внутри #ifdef
, по крайней мере, в моей системе:
#if defined __USE_SVID || defined __USE_XOPEN
Таквам, вероятно, придется явно установить один из этих макросов.
Однако, прежде чем пробовать его, имейте в виду, что он не работает.Это потому, что все эти вещи контролируются с помощью gcc
макрокоманд проверки возможностей .
Существует очень сложный набор правил, используемых для включения или выключения определенных функций в features.h
, исозданные там макросы управляют тем, что включают и исключают заголовочные файлы.Варианты __USE_*
очищаются и задаются в этом заголовочном файле на основе других макросов , предоставленных вами.
Например, чтобы получить __USE_SVID
, чтобы вы могли использовать srand48
,вам нужно предоставить компилятору параметр -D_SVID_SOURCE
.
Но, возможно, более простой способ - просто использовать C99 с расширениями GNU.Для этого замените -std=c99
на -std=gnu99
.
И для bzero
и close
их можно получить из strings.h
и unistd.h
соответственно.
Сначала я был немного смущен, почему они скомпилированы с -std=c99
, когда они абсолютно не имеют отношения к C99, но потом я понял, что флаг контролирует только то, что стандартные заголовки C
Ни strings.h
(обратите внимание, что имя во множественном числе, это не string.h
), ни unistd.h
не являются частью ISO C.