Подтвердить что ты не робот

Почему 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 для этой и других причин. Есть ли какой-то трюк, который мне не хватает?

4b9b3361

Ответ 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).