Jakie jest prawidłowe #include dla funkcji „sleep” w C?

124

Używam książki Big Nerd Ranch Objective-C Programming i zaczyna się od napisania w C w pierwszych kilku rozdziałach. W jednym z moich programów, które mam do tworzenia, używam funkcji uśpienia. W książce kazał mi umieścić #include <stdlib.h>pod #include <stdio.h>częścią. Ma to na celu wyeliminowanie ostrzeżenia, które mówi, że „Niejawna deklaracja funkcji 'sleep' jest nieprawidłowa w C99”. Ale z jakiegoś powodu po włożeniu #include <stdlib.h>ostrzeżenie nie znika .. Ten problem nie przeszkadza programowi w działaniu, ale byłem po prostu ciekawy, na którym #includemuszę użyć!

trludt
źródło
3
plus jeden za to, że był na tyle odważny, by zadać proste pytanie i pomóc mi.
Mark Ch
1
Jeśli używasz dowolnego burmistrza IDE (NetBeans, IntelliJ IDEA, Eclipse). wpisz nazwę dowolnej funkcji, a następnie Alt + Enter automatycznie zaimportuje bibliotekę, która ją posiada.
T04435
2
@ T04435: W bibliotekach C nie są importowane. Kompilator ich nie potrzebuje. Łącznik może je połączyć, ale tylko po kompilator jest zrobione . W C kompilator potrzebuje prototypu funkcji, aby użyć funkcji. Prototypy zwykle znajdują się w plikach nagłówkowych (.h).
alk

Odpowiedzi:

163

Sen strona mężczyzna mówi, że jest zadeklarowana <unistd.h>.

Streszczenie:

#include <unistd.h>

unsigned int sleep (unsigned int sekundy);

simonc
źródło
1
Nie mialam! Dziękuję Ci! trochę mi to przeszkadzało, ponieważ w książce było napisane, że <stdlib.h> pozbyłby się ostrzeżenia ... dziwne haha ​​@simonc
trludt
1
Czy nie byłoby lepiej użyć funkcji sleep () lub time () do utworzenia opóźnienia?
LandonZeKepitelOfGreytBritn
66

sleep jest funkcją niestandardową.

  • W systemie UNIX należy dołączyć <unistd.h>.
  • Na MS-Windows Sleepjest raczej z <windows.h>.

W każdym przypadku sprawdź dokumentację.

md5
źródło
4
w standardzie C. wrt POSIX, to jest
ivotron
W systemie UNIX uśpienie jest faktycznie uśpione i zajmuje mikrosekundy (milisekundy * 1000) zamiast sekund.
Agostino
6
Nie używaj usleep: "4.3BSD, POSIX.1-2001. POSIX.1-2001 deklaruje tę funkcję za przestarzałą; zamiast tego użyj nanosleep (2). POSIX.1-2008 usuwa specyfikację usleep ()." linux.die.net/man/3/usleep
Jetski S-type
62

Oto, czego używam w przypadku kodu międzyplatformowego:

#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;
}
Romain VIOLLETTE
źródło
2
fajne rozwiązanie, przydatne
HCarrasko
15
usleep () została usunięta w POSIX.1-2008. Użyj nanosleep (). linux.die.net/man/3/usleep
Jetski S-type
13

Tak sleep()powinno być

#include <unistd.h>
alk
źródło
8

sleep(3)jest w unistd.hśrodku, nie stdlib.h. Wpisz man 3 sleepw wierszu poleceń, aby potwierdzić dla swojego komputera, ale zakładam, że używasz komputera Mac, ponieważ uczysz się Objective-C, a na komputerze Mac potrzebujesz unistd.h.

Carl Norum
źródło