为什么在设置-std = c99时gcc不能找到random()接口?

时间:2009-02-22 18:12:13

标签: c gcc random c99 c89

我在源代码的顶部做"#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 个答案:

答案 0 :(得分:15)

man srandom表示该函数不是 C99的一部分,而是POSIX的一部分。

激活_BSD_SOURCE_XOPEN_SOURCE >= 500或声明srandom / random函数的任何其他合适的功能测试宏(请参阅man feature_test_macrosman 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

答案 1 :(得分:12)

是的,有一个缺失的技巧:您可以使用-std=gnu99代替-std=c99

-std=c99 #define s __STRICT_ANSI__,其中/usr/include/features.h解释为“默认情况下不启用C标准之外的任何内容”(没有它,您至少得到两个{ {1}}和_SVID_SOURCE)。另一方面,_BSD_SOURCE表示“C99加GNU扩展”(gcc默认为当前-std=gnu99,其C89等效,这就是为什么你需要指定一些东西来获得新的C99功能)。

作为替代方案,您可以启用功能测试宏(如@ litb的回答中所述)。查看我系统中的-std=gnu89,它需要/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是一个好主意。它允许您使用所有新标准功能和GNU扩展,结合某种回退(例如,-D_GNU_SOURCE - 样式功能测试)提供最大的灵活性。

参考文献:

答案 2 :(得分:0)

我在Ubuntu 9.10下的CodeBlocks中使用gcc创建了随机数(带编译器选项:-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]

答案 3 :(得分:-1)

我使用rand()和srand()。顺便说一句:你有没有忘记一两个头?至少第二个警告告诉了我。

尝试包括math.h. (记得我们总是遇到数学库的问题,不得不用-lm强制链接它。)