GNU/Linux >> Belajar Linux >  >> Linux

Kesalahan C++:Tidur tidak dideklarasikan dalam cakupan ini

Dalam kasus saya, menulis S membantu leep dan BUKAN s leep - sangat aneh, tapi berhasil!


Sleep adalah fungsi Windows.

Untuk Unix, lihat menggunakan nanosleep (POSIX) atau usleep (BSD; usang).

A nanosleep contoh:

void my_sleep(unsigned msec) {
    struct timespec req, rem;
    int err;
    req.tv_sec = msec / 1000;
    req.tv_nsec = (msec % 1000) * 1000000;
    while ((req.tv_sec != 0) || (req.tv_nsec != 0)) {
        if (nanosleep(&req, &rem) == 0)
            break;
        err = errno;
        // Interrupted; continue
        if (err == EINTR) {
            req.tv_sec = rem.tv_sec;
            req.tv_nsec = rem.tv_nsec;
        }
        // Unhandleable error (EFAULT (bad pointer), EINVAL (bad timeval in tv_nsec), or ENOSYS (function not supported))
        break;
    }
}

Anda membutuhkan <time.h> dan <errno.h> , tersedia dalam C++ sebagai <ctime> dan <cerrno> .

usleep lebih mudah digunakan (kalikan saja dengan 1000, jadi jadikan itu fungsi inline). Namun, tidak mungkin untuk menjamin bahwa tidur akan terjadi untuk jangka waktu tertentu, sudah usang, dan Anda perlu extern "C" { } -termasuk <unistd.h> .

Pilihan ketiga adalah menggunakan select dan struct timeval , seperti yang terlihat di http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntdll/sync.c#l1204 (beginilah cara wine mengemulasi Sleep , yang itu sendiri hanyalah pembungkus untuk SleepEx ).

Catatan :sleep (huruf kecil 's'), yang deklarasinya ada di <unistd.h> , tidak pengganti yang dapat diterima, karena perinciannya adalah detik, lebih kasar daripada Sleep Windows (huruf besar 's'), yang memiliki perincian milidetik.

Mengenai kesalahan kedua Anda, ___XXXcall adalah token khusus MSVC++ (sebagaimana __dllXXX , __naked , __inline , dll.). Jika Anda benar-benar perlu stdcall, gunakan __attribute__((stdcall)) atau mirip dengan menirunya di gcc.

Catatan :kecuali target kompilasi Anda adalah biner Windows dan Anda menggunakan API Win32, penggunaan atau persyaratan untuk stdcall adalah Tanda Buruk™.


#include <iostream>
#include <unistd.h>
using namespace std;
int main()
{
    const long a=1000000;
    long j;
    cin >> j;
    usleep(a*j);
    puts("exit");
}

gunakan usleep() Sebelum tidur dan Jangan lupa Sertakan unistd.h (Bukan cunistd )


Cara menggunakan usleep dalam program C++ di linux:

Masukkan ini ke dalam file bernama s.cpp

#include <iostream>
#include <unistd.h>
using namespace std;
int main() { 
  cout << "nitrate";
  cout << flush;
  usleep(1000000);
  cout << "firtilizers";
  return 0;
}

Kompilasi dan jalankan:

[email protected] ~/foo4/40_usleep $ g++ -o s s.cpp
[email protected] ~/foo4/40_usleep $ ./s
nitratefirtilizers

Itu mencetak 'nitrat', menunggu 1 detik, lalu mencetak 'firtilizers'


Linux
  1. "Variabel efi Tidak Didukung Pada Sistem Ini"?

  2. Cara Memperbaiki Kesalahan Editor Vi / Vim — E319:Maaf, perintah tidak tersedia di versi ini

  3. Kesalahan pernyataan pthread mutex

  1. kesalahan ldconfig:bukan tautan simbolik

  2. libevent tidak menemukan kesalahan di tmux

  3. sshpass:kesalahan perintah tidak ditemukan

  1. Kisah Linux saya:Saya dibesarkan di Majalah PC bukan permen

  2. [Memperbaiki] kesalahan:snap "paket" tidak ditemukan

  3. Perbaiki kesalahan Class ZipArchive tidak ditemukan [PHP 7]