Що є належним #include для функції "сон" в C?


124

Я використовую програму «Об'єктивне-С» програму Big Nerd Ranch, і це починається з того, щоб ми писали на С у перших кількох главах. В одній із моїх програм, яку він створює, я використовую функцію сну. У книзі було сказано, щоб я підклав #include <stdlib.h>під #include <stdio.h>частину. Це повинно позбутися попередження, яке говорить, що "Неявне оголошення функції" сон "недійсне в C99". Але чомусь після того, як я поставив #include <stdlib.h>, попередження не зникає .. Ця проблема не заважає програмі нормально працювати, але мені було просто цікаво, на чому #includeмені потрібно було користуватися!


3
плюс один за те, що ви досить сміливі, щоб задати просте запитання і допомогти мені.
Марк Ч.

1
Якщо ви використовуєте будь-який ID ID мера (NetBeans, IntelliJ IDEA, Eclipse). введіть назву будь-якої функції, тоді Alt + Enter вона автоматично імпортує бібліотеку, яка має її.
T04435

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

Відповіді:


163

Сторінка людини сну говорить, що це оголошено в <unistd.h>.

Конспект:

#include <unistd.h>

непідписаний int сон (unsigned int секунд);


1
У мене не було! Дякую! це мене просто набридло, тому що в книзі сказано, що <stdlib.h> позбудеться попередження ... дивно ха-ха @simonc
trludt

1
Чи було б краще використовувати функцію сну () або час () для створення затримки?
LandonZeKepitelOfGreytBritn

66

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

  • У UNIX ви повинні включити <unistd.h>.
  • У MS-Windows, Sleepшвидше, від <windows.h>.

У кожному випадку перевіряйте документацію.


4
wrt стандарт С. wrt POSIX, це
ivotron

У UNIX режим сну насправді спить, і він займає мікросекунди (мілісекунди * 1000) замість секунд.
Агостіно

6
Не використовуйте usleep: "4.3BSD, POSIX.1-2001. POSIX.1-2001 оголошує цю функцію застарілою; замість цього використовуйте nanosleep (2). POSIX.1-2008 видаляє специфікацію usleep ()." linux.die.net/man/3/usleep
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
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.