我愿意 "#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 。我缺少什么技巧吗?

有帮助吗?

解决方案

man srandom说,功能是C99的的一部分,但POSIX的一部分。

启动_BSD_SOURCE_XOPEN_SOURCE >= 500或任何其它合适的功能测试宏声明了srandom /随机函数(见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

其他提示

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

-std=c99 #defines __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-风格的功能测试)提供了最大的灵活性。

参考:

我的Ubuntu 9.10下创建使用代码块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;
}

这是唯一的想法,当然也可以通过其他方法完成它;-) [要安装的码块使用:sudo apt-get install build-essential然后sudo apt-get install codeblocks]

我使用兰特()和srand()函数。 BTW:你忘了一个或两个头?至少第二警告告诉我。

尝试包括math.h中(只记得我们一直与数学库的问题,与实际强制与-lm链接它)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top