Каков правильный #include для функции сна в C?


124

Я использую книгу Big Nerd Ranch Objective-C Programming, и она начинается с того, что мы пишем на C в первых нескольких главах. В одной из моих программ, которую я создал, я использую функцию сна. В книге мне сказали положить #include <stdlib.h>под #include <stdio.h>деталь. Это должно избавить от предупреждения о том, что «Неявное объявление функции 'sleep' недопустимо в C99». Но почему-то после того, как я поставил #include <stdlib.h>, предупреждение не уходит .. Эта проблема не мешает программе нормально работать, а мне просто было любопытно, на чем #includeмне нужно было пользоваться!


3
плюс один за то, что был достаточно храбрым, чтобы задать простой вопрос и помочь мне.
Марк Ч

1
Если вы используете любую среду разработки (NetBeans, IntelliJ IDEA, Eclipse). введите имя любой функции, затем Alt + Enter автоматически импортирует библиотеку, в которой она есть.
T04435 08

2
@ T04435: В C библиотеки не импортируются. Компилятору они не нужны. Компоновщик может связать их, но только после того, как компилятор сделал . В C компилятору нужен прототип функции, чтобы использовать функцию. Прототипы обычно поступают в файлы заголовков (.h).
alk

Ответы:


163

На странице руководства по сну говорится, что он объявлен в <unistd.h>.

Сводка:

#include <unistd.h>

unsigned int sleep (беззнаковые целые секунды);


1
Я не имел! Спасибо! это меня просто беспокоило, потому что в книге сказано, что <stdlib.h> избавится от предупреждения ... странно, ха-ха @simonc
trludt

1
Было бы лучше использовать функцию sleep () или time () для создания задержки?
LandonZeKepitelOfGreytBritn

66

sleep - нестандартная функция.

  • В UNIX вы должны включить <unistd.h>.
  • В MS-Windows Sleepскорее из <windows.h>.

В любом случае проверяйте документацию.


4
по стандарту C. wrt POSIX, это так
ivotron

В UNIX Sleep фактически является usleep и занимает микросекунды (миллисекунды * 1000) вместо секунд.
Агостино,

6
Не используйте usleep: «4.3BSD, POSIX.1-2001. POSIX.1-2001 объявляет эту функцию устаревшей; используйте вместо нее nanosleep (2). POSIX.1-2008 удаляет спецификацию usleep ()». linux.die.net/man/3/usleep
Jetski S-type

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

15
usleep () был удален в POSIX.1-2008. Используйте nanosleep (). linux.die.net/man/3/usleep
Jetski S-type


8

sleep(3)в unistd.h, нет stdlib.h. Введите man 3 sleepв командной строке, чтобы подтвердить свой компьютер, но я предполагаю, что вы работаете на Mac, так как вы изучаете Objective-C, а на Mac вам нужно unistd.h.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.