GNU/Linux >> Tutoriels Linux >  >> Linux

Erreur C++ :la veille n'a pas été déclarée dans cette portée

Dans mon cas, il a aidé à écrire S sommeil et PAS s leep - très étrange, mais a fonctionné !


Sleep est une fonction Windows.

Pour Unix, envisagez d'utiliser nanosleep (POSIX) ou usleep (BSD ; obsolète).

Un nanosleep exemple :

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++ en tant que <ctime> et <cerrno> .

usleep est plus simple à utiliser (multipliez simplement par 1000, faites-en donc une fonction en ligne). Cependant, il est impossible de garantir que ce sommeil se produira pendant une durée donnée, c'est obsolète et vous devez extern "C" { } -inclure <unistd.h> .

Un troisième choix consiste à utiliser select et struct timeval , comme on le voit dans http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntdll/sync.c#l1204 (c'est ainsi que wine émule Sleep , qui lui-même n'est qu'un wrapper pour SleepEx ).

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

Concernant votre deuxième erreur, ___XXXcall est un jeton spécifique à MSVC++ (tout comme __dllXXX , __naked , __inline , etc.). Si vous vraiment besoin d'un appel standard, utilisez __attribute__((stdcall)) ou similaire pour l'émuler dans gcc.

Remarque :sauf si votre cible de compilation est un binaire Windows et vous utilisez des API Win32, utilisez ou exigez stdcall est un mauvais signe™.


#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() Au lieu de dormir et N'oubliez pas d'inclure unistd.h (Pas cunistd )


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

Mettez 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 exécutez-le :

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

Il a imprimé 'nitrate', a attendu 1 seconde, puis a imprimé 'firtilizers'


Linux
  1. Mon histoire Linux :j'ai grandi sur PC Magazine, pas sur des bonbons

  2. Erreur de compilation RSAKeyFind (Make):rsakeyfind.cpp - "memcmp, lire, fermer" n'a pas été déclaré dans cette portée [Résolu]

  3. Commande yum-config-manager introuvable [Réparer]

  4. c_rehash :Erreur de commande introuvable – Solution

  5. Cette erreur à propos de Upstart/systemd avec Runit ?

Dépannage de l'erreur "Bash :Commande introuvable" sous Linux

If…else…if Statement (erreur de commande introuvable) ?

tar :l'erreur n'est pas récupérable :sortie maintenant

erreur ldconfig :n'est pas un lien symbolique

libevent introuvable erreur dans tmux

sshpass :erreur de commande introuvable