GNU/Linux >> LINUX-Kenntnisse >  >> Linux

C++-Fehler:Sleep wurde in diesem Bereich nicht deklariert

In meinem Fall hat es geholfen, S zu schreiben leep und NICHT s leep - sehr seltsam, aber funktioniert!


Sleep ist eine Windows-Funktion.

Sehen Sie sich für Unix die Verwendung von nanosleep an (POSIX) oder usleep (BSD; veraltet).

Ein nanosleep Beispiel:

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;
    }
}

Sie benötigen <time.h> und <errno.h> , verfügbar in C++ als <ctime> und <cerrno> .

usleep ist einfacher zu verwenden (multiplizieren Sie einfach mit 1000, machen Sie es also zu einer Inline-Funktion). Es ist jedoch unmöglich zu garantieren, dass dieses Schlafen für eine bestimmte Zeitdauer auftritt, es ist veraltet und Sie müssen extern "C" { } - Fügen Sie <unistd.h> ein .

Eine dritte Möglichkeit ist die Verwendung von select und struct timeval , wie in http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntdll/sync.c#l1204 zu sehen (so emuliert wine Sleep , die selbst nur ein Wrapper für SleepEx ist ).

Hinweis :sleep (kleines 's'), dessen Deklaration in <unistd.h> steht , ist nicht ein akzeptabler Ersatz, da seine Granularität Sekunden beträgt, gröber als die von Windows' Sleep (großes 's'), das eine Granularität von Millisekunden hat.

Zu Ihrem zweiten Fehler, ___XXXcall ist ein MSVC++-spezifisches Token (ebenso wie __dllXXX , __naked , __inline , etc.). Wenn Sie wirklich stdcall benötigen, verwenden Sie __attribute__((stdcall)) oder ähnlich, um es in gcc zu emulieren.

Hinweis :es sei denn, Ihr Kompilierungsziel ist eine Windows-Binärdatei und Sie verwenden Win32-APIs, Verwendung von oder eine Anforderung für stdcall ist ein schlechtes Zeichen™.


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

Verwenden Sie usleep() Anstatt zu schlafen und vergessen Sie nicht, unistd.h einzufügen (Nicht cunistd )


Wie man usleep in einem C++-Programm unter Linux verwendet:

Fügen Sie dies in eine Datei namens s.cpp ein

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

Kompilieren Sie es und führen Sie es aus:

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

Es druckte „nitrat“, wartete 1 Sekunde und druckte dann „firtilizers“


Linux
  1. Fehler „Klasse ZipArchive nicht gefunden“ behoben [PHP 7]

  2. Schlafbefehl mit Bildschirmbefehl wird in Ps nicht angezeigt?

  3. So beheben Sie den Vi/Vim-Editor-Fehler – E319:Entschuldigung, der Befehl ist in dieser Version nicht verfügbar

  4. tar:Fehler ist nicht behebbar:wird jetzt beendet

  5. sshpass:Fehler „Befehl nicht gefunden“.

Meine Linux-Geschichte:Ich bin mit dem PC Magazine aufgewachsen, nicht mit Süßigkeiten

[Behoben] Fehler:Snap „Paket“ nicht gefunden

Fehlerbehebung „Bash:Command Not Found“-Fehler in Linux

If…else…if-Anweisung (Fehler „Befehl nicht gefunden“)?

libevent nicht gefunden Fehler in tmux

ssh-copy-id funktioniert nicht