18

"#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

4 回答 4

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
于 2009-02-22T18:39:16.573 回答
12

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

-std=c99 #defines __STRICT_ANSI__,它/usr/include/features.h解释为“默认情况下不启用 C 标准之外的任何东西”(没有它,您至少会同时得到_SVID_SOURCEand _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(enables __USE_XOPEN_EXTENDED)
  • _XOPEN_SOURCE_EXTENDED(也启用__USE_XOPEN_EXTENDED
  • _GNU_SOURCE(启用一切,包括上面的四个功能测试宏)

对于您不太担心与未来标准中的新功能的潜在名称冲突的新程序,同时使用-std=gnu99-D_GNU_SOURCE是一个好主意。它允许您使用所有新的标准功能和 GNU 扩展,结合某种回退(例如,autoconf-style 功能测试)提供了最大的灵活性。

参考:

于 2009-07-06T01:46:44.760 回答
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]

于 2010-01-17T15:44:16.220 回答
-1

我使用 rand() 和 srand()。顺便说一句:你忘了一两个标题吗?至少第二个警告是这样告诉我的。

尝试包括 math.h。(只记得我们总是遇到数学库问题,并且必须实际强制将其与 -lm 链接)。

于 2009-02-22T18:23:57.530 回答