Почему gcc не может найти интерфейс random(), когда установлен параметр -std = c99?
Я делаю "#include <stdlib.h>"
в верхней части источника.
Пример компиляции:
/usr/bin/colorgcc -std=c99 -fgnu89-inline -g -Wall -I/usr/include -I./ -I../ -I../../ -I../../../ -I../../../../ -O3 -o f8 f8.c
In file included from f8.c:7:
ctype-cmp.c: In function ‘randomized’:
ctype-cmp.c:48: warning: implicit declaration of function ‘random’
ctype-cmp.c: In function ‘main’:
ctype-cmp.c:153: warning: implicit declaration of function ‘srandom’
[email protected]:t$
Когда я выключаю -std = c99, функция isfinite() не может быть найдена. Поэтому я хочу использовать -std = c99 для этой и других причин. Есть ли какой-то трюк, который мне не хватает?
Ответы
Ответ 1
man srandom
говорит, что функция не является частью C99, а является частью POSIX.
Активируйте _BSD_SOURCE
или _XOPEN_SOURCE >= 500
или любой другой подходящий макрос проверки функций, который объявляет функцию srandom/random (см. man feature_test_macros
и man srandom
).
У этого есть хорошие шансы, но вам нужно выяснить макросы, которые определены/не определены неявно, тем самым, также прочитав приведенные выше manpages.
/usr/bin/colorgcc -std=c99 -D_XOPEN_SOURCE=600 -fgnu89-inline -g -Wall
-I/usr/include -I./ -I../ -I../../ -I../../../ -I../../../../ -O3 -o f8 f8.c
Ответ 2
Да, есть трюк, который вам не хватает: вы можете использовать -std=gnu99
вместо -std=c99
.
-std=c99
#define
__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
-типов) обеспечивают максимальную гибкость.
Литература:
Ответ 3
Я создал случайные числа, используя gcc в CodeBlocks под Ubuntu 9.10 (с параметрами компилятора: -std=gnu99 -D_GNU_SOURCE
). Так это сработало для меня:
Это мой код, с которым я играл:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
enum computer {keyboard, CPU, screen, printer};
int main(void)
{
enum computer comp;
time_t casovac;
comp = CPU;
srand(&casovac);
printf("%d", rand());
return 0;
}
Это была только идея, конечно, вы можете выполнить ее другими способами;-) [Для установки CodeBlocks используйте: sudo apt-get install build-essential
, а затем sudo apt-get install codeblocks
]
Ответ 4
Я использую rand() и srand(). BTW: Вы забыли заголовок или два? Как минимум второе предупреждение говорит мне об этом.
Попробуйте включить math.h. (Просто помните, что у нас всегда были проблемы с математической библиотекой, и мне пришлось навязать ссылку с помощью -lm).