【问题标题】:Why can't gcc find the random() interface when -std=c99 is set?为什么设置 -std=c99 时 gcc 找不到 random() 接口?
【发布时间】:2010-10-09 04:31:33
【问题描述】:

我在源代码的顶部做"#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 。有什么我遗漏的技巧吗?

【问题讨论】:

    标签: c gcc random c99 c89


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      是的,您缺少一个技巧:您可以使用-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 风格的功能测试)提供了最大的灵活性。

      参考资料:

      【讨论】:

        【解决方案3】:

        我在 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]

        【讨论】:

          【解决方案4】:

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

          尝试包含 math.h。 (记得我们总是在使用数学库时遇到问题,并且不得不将其与 -lm 强制链接)。

          【讨论】:

          • 由于包含正确的标头(stdlib 和数学),因此我不得不对此响应投反对票。诀窍是定义宏。感谢您的回复!
          • 我没看到你提到过 math.h
          • 作为一个总 C 菜鸟,我很欣赏提到 srand 至少。谢谢!
          猜你喜欢
          • 2012-08-15
          • 2011-01-12
          • 2013-11-27
          • 1970-01-01
          • 2017-01-17
          • 2014-12-23
          • 1970-01-01
          • 2012-11-17
          • 1970-01-01
          相关资源
          最近更新 更多