Ошибка С++: сон не был объявлен в этой области

Я использую С++ в Ubuntu с codeBlocks, повышаю 1.46 в GCC 4.7 [yield_k.hpp]

Я получаю эту ошибку времени компиляции:

error : Sleep was not declared in this scope

код:

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

Как устранить эту ошибку? Я хочу, чтобы программа зависала в течение 1 секунды.

Ответы

Ответ 1

Sleep - это функция Windows.

Для Unix изучите использование nanosleep (POSIX) или usleep (BSD, устаревшее).

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

Вам понадобятся <time.h> и <errno.h>, доступные в С++ как <ctime> и <cerrno>.

usleep проще использовать (просто умножьте на 1000, поэтому сделайте его встроенной функцией). Тем не менее, невозможно гарантировать, что спать будет происходить в течение определенного времени, оно устарело, и вам нужно extern "C" { } -ключить <unistd.h>.

Третий вариант заключается в использовании select и struct timeval, как показано в http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntdll/sync.c#l1204 (это то, как вино эмулирует Sleep, который сам по себе является только оберткой для SleepEx).

Примечание: Sleep (строчные буквы '), декларация которых находится в <unistd.h>, не является приемлемой заменой, так как ее гранулярность - секунды, более грубые, чем у Windows Sleep (верхний регистр), который имеет степень детализации в миллисекундах.

Что касается вашей второй ошибки, ___XXXcall является специфичным для MSVС++ токеном (как __dllXXX, __naked, __inline и т.д.). Если вам действительно нужен stdcall, используйте __attribute__((stdcall)) или аналогичный, чтобы эмулировать его в gcc.

Примечание. Если ваша цель компиляции не является двоичным файлом Windows, и вы используете API Win32, использование или требование для stdcall - это Bad Sign ™.

Ответ 2

Как использовать usleep в программе на С++ в linux:

Поместите это в файл с именем s.cpp

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

Скомпилируйте его и запустите:

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

Он напечатал "нитрат", ждал 1 секунду, затем напечатал "firtilizers"

Ответ 3

В моем случае это помогло написать S leep и НЕ s leep - очень странно, но сработало!

Ответ 4

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

Использовать usleep() Привязан к сна и Не забудьте включить unistd.h (Не cunistd)