web-dev-qa-db-fra.com

Erreur C++: le sommeil n'a pas été déclaré dans cette étendue

J'utilise C++ dans Ubuntu avec CodeBlocks, boost 1.46 dans GCC 4.7 [yield_k.hpp]

Je reçois cette erreur de compilation: 

error : Sleep was not declared in this scope

Code:

#include <iostream>
using namespace std;
int main() { 
  cout << "nitrate";
  cout << flush;
  sleep(1000);
  cout << "firtilizers";
  return 0;
}

Comment puis-je résoudre cette erreur? Je veux que le programme soit suspendu pendant 1 seconde.

15
Mahika

Sleep est une fonction Windows.

Pour Unix, utilisez nanosleep (POSIX) ou usleep (BSD; obsolète).

Un exemple nanosleep:

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

Vous aurez besoin de <time.h> et <errno.h>, disponible en C++ sous le nom <ctime> et <cerrno>.

usleep est plus simple à utiliser (il suffit de multiplier par 1000, alors faites-en une fonction inline). Cependant, il est impossible de garantir que le sommeil se produira pendant un laps de temps donné, il est déconseillé et vous devez extern "C" { }- inclure <unistd.h>.

Un troisième choix consiste à utiliser select et struct timeval, comme indiqué dans http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntdll/ sync.c # l1204 (c’est ainsi que wine émule Sleep, qui n’est en soi qu’un wrapper pour SleepEx).

Remarque : sleep (minuscules), dont la déclaration est dans <unistd.h>, est not un substitut acceptable, car sa granularité est en secondes, plus grossière que celle de Windows 'Sleep (majuscules' s '), qui a une granularité de millisecondes.

En ce qui concerne votre deuxième erreur, ___XXXcall est un jeton spécifique à MSVC++ (comme le sont __dllXXX, __naked, __inline, etc.). Si vous vraiment avez besoin de stdcall, utilisez __attribute__((stdcall)) ou similaire pour l’émuler dans gcc.

Remarque : à moins que votre cible de compilation ne soit un binaire Windows et si vous utilisez des API Win32, utilisez ou une exigence de stdcall est A Bad Sign ™.

24
moshbear

Comment utiliser usleep dans un programme C++ sous Linux:

Placez ceci dans un fichier appelé s.cpp

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

Compilez-le et lancez-le:

el@defiant ~/foo4/40_usleep $ g++ -o s s.cpp
el@defiant ~/foo4/40_usleep $ ./s
nitratefirtilizers

Il imprimait 'nitrate', attendait 1 seconde, puis imprimait 'firtilizers'

13
Eric Leschinski

Dans mon cas, cela m'a aidé d'écrireSleep et PAS s leep - très étrange, mais a fonctionné!

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

utilisez usleep() Instance de sommeil et N'oubliez pas d'inclure unistd.h(Pas cunistd)

1
user8435497