【问题标题】:using randomize() without time.h in C在 C 中使用没有 time.h 的 randomize()
【发布时间】:2013-04-02 16:45:29
【问题描述】:

我能够在不包含 time.h 库的情况下运行使用 randomize 函数的代码。它是否自动包含在我可能已经包含在我的代码中的其他一些库中?以下是我包含的库的列表:

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <string.h> 
#include <io.h>

【问题讨论】:

  • 其中一条加热器线可能包含 time.h
  • 你在使用 TurboC 编译器吗?
  • @ScottMermelstein 是这样的:randomize();random(300);@0A0D 我正在使用 TurboC++

标签: c random time.h


【解决方案1】:

这对于您的库的版本和实现非常具体。该标准不强制任何标题包含 time.h 1 所以你不能依赖它。

在您的情况下,可能是 dos.hio.hconio.h 之一包含 time.h(或任何其他标题)。


1 至少不是那里的那些,也不可能在你看似古老的图书馆里。 C11 说threads.h 应该包含time.h

【讨论】:

  • dos.h 中的这一行能否解释一下:void _Cdecl _dos_gettime( struct dostime_t *__timep );
  • @yonatan,我在randomize() 上找不到任何文档,所以我无法确定。但是,您的电话(即randomize()random(300))似乎完全使用时间函数。为什么您希望 time.h 被包括在内?您需要找出在您的非标准平台中定义randomize 的位置。 stdlib.h 是个不错的猜测。
  • 由于randomize() 使random() 的初始值根据当前时间随机化,因此编译器文档声明它需要time.h
  • 由于randomize()不带任何参数,所以它正在调用time.h相关函数本身。这意味着在实现函数randomize()的源文件中,包含time.h。一旦编写了 turbo C 附带的库的任何人编译了该源文件,randomize() 将自行正常工作。您不需要为其包含头文件。
  • 从你的术语来看,我想我明白问题出在哪里。你看,当你写#include &lt;time.h&gt; 时,你包括一个,你只是让库的界面对你可见。库本身在编译后的稍后阶段由链接器链接。所以如果你自己不使用时间函数,你就不需要包含它的头文件。但是,由于时间函数在标准库中,因此无论您喜欢与否,它们都会与您的程序链接。
【解决方案2】:

&lt;compiler with high warning level&gt; yourcode.c 说什么?我的猜测是:

  • 任一非标准 DOS 特定标头(conio.hdos.hio.h、...)都包含它,

  • 或者根本没有声明,即。 e.它不包括在内,在这种情况下,您的编译器会静默隐式地假定函数签名(具体来说,它假定返回值 int 以及您第一次调用它时使用的任何类型的参数)。

请注意,后一种情况是错误的,,您应该注意不要这样做(因为它可能会导致您的程序调用未定义的行为)。始终在启用所有警告的情况下进行编译,以便跟踪此类错误。

【讨论】:

  • @0A0D 请详细说明,这是什么意思?我查看了那个链接,&lt;stdlib.h&gt; 中没有 time()
  • 我的意思是在非标准平台上,比如我链接的ticalc网站,randomize()是stdlib中的一个函数。
【解决方案3】:

当 C 编译器找不到函数的原型时,它假定它是一个返回 int 的函数。如果您没有更改默认设置,它还会打印警告功能。

所以。在您的情况下,可能包含 time.h,但请注意,如果不包含它可能会导致很多问题。

【讨论】:

    猜你喜欢
    • 2015-08-18
    • 2012-10-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多