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.
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 ™.
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'
Dans mon cas, cela m'a aidé d'écrireSleep et PAS s leep - très étrange, mais a fonctionné!
#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
)