【问题标题】:Sleep | warning implicit declaration of function `sleep'?睡眠 |警告函数“睡眠”的隐式声明?
【发布时间】:2017-01-02 13:29:57
【问题描述】:

我正在学习 C。 在这个节目中 我使用睡眠功能来减慢倒计时。 我的教科书没有指定我应该包含使用睡眠功能的库。 所以我使用它而不包括任何特殊的库,它可以工作。 但它在代码块中给了我这个警告信息。 我尝试包含<windows.h>,但仍然出现相同的警告消息。

警告 D:\Project\C 语言\trial8\trial8.c|19|警告:隐式 函数`sleep'的声明|

这是我的代码。

#include <stdio.h>
int main()
{
    int start;

    do
    {
        printf("Please enter the number to start\n");
        printf("the countdown (1 to 100):");
        scanf("%d",&start);
    }
    while(start<1 || start>100);

    do
    {
        printf("T-minus %d\n",start);
        start--;
        sleep(3000); 
    }
    while(start>0);
    printf("Zero!\n Go!\n");
    return(0);
}

我想知道警告信息是什么意思?它有多重要?有什么我应该做的吗?请注意,该程序仍然有效。

【问题讨论】:

  • 那么,您是否阅读了sleep 的手册页?它说什么你应该包括哪个标题

标签: c windows sleep


【解决方案1】:

Windows 没有sleep 函数。相反,它有Sleep,它需要多少毫秒才能休眠:

VOID WINAPI Sleep(
  _In_ DWORD dwMilliseconds
);

您需要#include &lt;windows.h&gt;#include &lt;synchapi.h&gt;,具体取决于您运行的 Windows 版本。详情请见MSDN

【讨论】:

    【解决方案2】:

    函数sleep 不是C 编程语言的一部分。因此,C 编译器需要它的声明/原型,以便它可以了解参数的数量及其数据类型以及函数的返回数据类型。当它没有找到它时,它会创建该函数的Implicit Declaration

    在 Linux 中,sleep&lt;unistd.h&gt; 中有一个原型,而在 Windows 中,还有另一个函数 Sleep&lt;windows.h&gt;&lt;synchapi.h&gt; 中有一个原型。 如果您在使用函数之前明确提供函数的原型,则始终可以避免包含标头。当您只需要头文件中的几个函数时,它很有用。

    windows上C语言Sleep函数原型为:

    VOID WINAPI Sleep(_In_ DWORD dwMilliseconds);
    

    请记住,通过包含适当的头文件或通过显式编写它来提供正在使用的函数的原型始终是一个好习惯。甚至,如果你不提供它,编译器大部分时间只会抛出一个警告,它会做出一个假设,在大多数情况下这将是你不想要的东西。最好包含头文件,因为 API 可能会在库的未来版本中发生变化。

    【讨论】:

    • 便携式 sleep: unsigned sleep(unsigned x) { time_t t0=time(0); while (difftime(time(0),t0)&lt;x); return 0; } ;-)
    • 最好使用header,以防原型在更高版本的API中发生变化
    • @R.:哎呀,请澄清这是个玩笑,我很确定有人认真对待你(有趣的事实:在我工作的代码库中有几个clock_t t0 = clock (); while((clock()-t0)/CLOCK_PER_SEC&lt;limit);。由于忙于等待,它们大多是准确的,但它们并不能很好地利用 CPU(而且多线程确实使它们不太准确)。
    • @MatteoItalia:是的,我的便携式sleep 主要是个玩笑,但它大概可以用作在没有更好的地方的最后手段。
    【解决方案3】:

    问题出在库(头文件)中:

    Windows上:

    #include &lt;windows.h&gt;Sleep(1000); => 1000 毫秒

    Linux 上:

    #include &lt;unistd.h&gt;sleep(1); => 1 秒

    【讨论】:

      【解决方案4】:

      要使其更跨平台,试试这个:

      #ifdef _WIN32
      #include <Windows.h>
      #else
      #include <unistd.h>
      #endif
      
      

      【讨论】:

        猜你喜欢
        • 2012-04-07
        • 2021-05-11
        • 1970-01-01
        • 1970-01-01
        • 2012-08-08
        • 2010-12-12
        • 2014-12-13
        • 1970-01-01
        相关资源
        最近更新 更多