对于C中的“睡眠”功能,正确的#include是什么?


124

我正在使用Big Nerd Ranch的《 Objective-C编程》一书,它的开头是让我们在前几章中用C编写。在我创建的其中一个程序中,我使用了睡眠功能。在书中,它告诉我将其放在#include <stdlib.h>下面#include <stdio.h>。可以消除这样的警告:“函数'sleep'的隐式声明在C99中无效”。但是由于某种原因,我放置了#include <stdlib.h>,警告并没有消失。这个问题并不能阻止程序正常运行,但是我只是好奇#include我需要使用哪个!


3
再加上一个勇于问一个简单问题并帮助我的人。
Mark Ch

1
如果使用任何市长IDE(NetBeans,IntelliJ IDEA,Eclipse)。输入任何函数的名称,然后按Alt + Enter将自动导入具有该函数的库。
T04435 '16

2
@ T04435:在C库中未导入。编译器并没有需要他们。链接器可以链接它们,但只能编译器完成之后。在C语言中,编译器需要函数原型才能使用函数。原型通常位于头文件(.h)中。
ALK

Answers:


163

睡眠手册页说它在中声明<unistd.h>

概要:

#include <unistd.h>

unsigned int sleep(未签名int秒);


1
我没有!谢谢!这只是一种困扰着我,因为书上说的是,<stdlib.h>中就摆脱了警告...怪异哈哈@simonc的
trludt

1
使用sleep()函数或time()来创建延迟会更好吗?
LandonZeKepitelOfGreytBritn '17

66

sleep 是非标准功能。

  • 在UNIX上,您应包括<unistd.h>
  • 在MS-Windows上,Sleep则来自<windows.h>

在每种情况下,请检查文档。


4
C标准。wrt POSIX,是
ivotron 2014年

在UNIX上,睡眠实际上是usleep,它花费的时间是微秒(毫秒* 1000)而不是秒。
阿戈斯蒂诺

6
不要使用usleep:“ 4.3BSD,POSIX.1-2001。POSIX.1-2001声明此功能已过时;请使用nanosleep(2)。POSIX.1-2008删除了usleep()的规范。” linux.die.net/man/3/usleep
S型

62

这就是我使用的跨平台代码:

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

int main()
{
  pollingDelay = 100
  //do stuff

  //sleep:
  #ifdef _WIN32
  Sleep(pollingDelay);
  #else
  usleep(pollingDelay*1000);  /* sleep for 100 milliSeconds */
  #endif

  //do stuff again
  return 0;
}

2
不错的解决方案,有用
HCarrasko 2015年

15
usleep()在POSIX.1-2008中已删除。使用nanosleep()。linux.die.net/man/3/usleep
S型

13

因为sleep()应该

#include <unistd.h>

8

sleep(3)unistd.h,不是stdlib.hman 3 sleep在命令行上键入以确认您的机器,但由于您正在学习Objective-C,因此我认为您使用的是Mac,而在Mac上则需要unistd.h

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.