Apa #include yang tepat untuk fungsi 'sleep' di C?

124

Saya menggunakan buku Big Nerd Ranch Objective-C Programming, dan itu dimulai dengan meminta kami menulis dalam C di beberapa bab pertama. Di salah satu program yang saya buat, saya menggunakan fungsi tidur. Di buku itu menyuruh saya untuk meletakkan di #include <stdlib.h>bawah #include <stdio.h>bagian. Ini seharusnya menghilangkan peringatan yang mengatakan "Deklarasi implisit fungsi 'tidur' tidak valid di C99". Tetapi untuk beberapa alasan setelah saya meletakkan #include <stdlib.h>, peringatan tidak hilang .. Masalah ini tidak menghentikan program berjalan dengan baik, tetapi saya hanya ingin tahu yang mana yang #includeperlu saya gunakan!

lumpur
sumber
3
ditambah satu karena cukup berani untuk mengajukan pertanyaan sederhana dan membantu saya.
Mark Ch
1
Jika Anda menggunakan IDE mayor (NetBeans, IntelliJ IDEA, Eclipse). ketikkan nama fungsi apa pun, lalu Alt + Enter itu akan mengimpor pustaka yang memilikinya secara otomatis.
T04435
2
@ T04435: Di perpustakaan C tidak diimpor. Kompiler tidak membutuhkannya. Linker mungkin menautkannya, tetapi hanya setelah kompilator selesai . Dalam C kompilator membutuhkan prototipe suatu fungsi untuk menggunakan suatu fungsi. Prototipe biasanya datang dalam file header (.h).
alk

Jawaban:

163

Halaman manual tidur mengatakan itu dideklarasikan dalam <unistd.h>.

Ringkasan:

#include <unistd.h>

unsigned int sleep (detik int unsigned);

simonc
sumber
1
Saya tidak! Terima kasih! itu hanya mengganggu saya, karena buku mengatakan bahwa <stdlib.h> akan menghilangkan peringatan ... aneh haha ​​@simonc
trludt
1
Apakah lebih baik menggunakan fungsi sleep () atau time () untuk membuat penundaan?
LandonZeKepitelOfGreytBritn
66

sleep adalah fungsi non-standar.

  • Di UNIX, Anda harus memasukkan <unistd.h>.
  • Pada MS-Windows, Sleepbukan dari <windows.h>.

Dalam setiap kasus, periksa dokumentasinya.

md5
sumber
4
wrt standar C. wrt POSIX, ini
ivotron
Di UNIX, Tidur sebenarnya menggunakan mode tidur dan membutuhkan mikrodetik (milidetik * 1000), bukan detik.
Agostino
6
Jangan gunakan usleep: "4.3BSD, POSIX.1-2001. POSIX.1-2001 menyatakan fungsi ini usang; sebagai gantinya gunakan nanosleep (2). POSIX.1-2008 menghapus spesifikasi usleep ()." linux.die.net/man/3/usleep
Jetski S-type
62

inilah yang saya gunakan untuk kode lintas platform:

#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;
}
PELANGGARAN Romain
sumber
2
solusi bagus, berguna
HCarrasko
15
usleep () telah dihapus di POSIX.1-2008. Gunakan nanosleep (). linux.die.net/man/3/usleep
Jetski S-type
13

Untuk sleep()itu seharusnya

#include <unistd.h>
alk
sumber
8

sleep(3)masuk unistd.h, tidak stdlib.h. Ketik man 3 sleepbaris perintah Anda untuk mengonfirmasi mesin Anda, tetapi saya kira Anda menggunakan Mac karena Anda mempelajari Objective-C, dan di Mac, Anda membutuhkannya unistd.h.

Carl Norum
sumber