Почему gcc не может найти интерфейс random (), если задано -std = c99? - PullRequest
18 голосов
/ 22 февраля 2009

Я делаю "#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’
ais@xcalibur:t$ 

Когда я выключаю -std = c99, функция isfinite () не может быть найдена. Поэтому я хочу использовать -std = c99 по этой и другим причинам. Есть какой-то трюк, который мне не хватает?

Ответы [ 4 ]

15 голосов
/ 22 февраля 2009

man srandom говорит, что функция не часть C99, а часть POSIX.

Активируйте _BSD_SOURCE или _XOPEN_SOURCE >= 500 или любой другой подходящий макрос тестирования функций, который объявляет функцию srandom / random (см. man feature_test_macros и man srandom).

У этого есть хорошие шансы, но вам нужно выяснить макросы, которые определены / не определены неявно, тем самым, читая страницы руководства выше.

/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
12 голосов
/ 06 июля 2009

Да, есть трюк, который вам не хватает: вы можете использовать -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) дает наибольшую гибкость.

Ссылки:

0 голосов
/ 17 января 2010

Я создал случайные числа, используя 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]

0 голосов
/ 22 февраля 2009

Я использую rand () и srand (). Кстати: вы забыли заголовок или два? По крайней мере, второе предупреждение говорит мне об этом.

Попробуйте включить математику (Только что вспомнил, что у нас всегда были проблемы с математической библиотекой, и мы должны были принудительно связать ее с -lm).

...