web-dev-qa-db-ja.com

C ++エラー:このスコープではスリープが宣言されていません

CodeBlocksを使用してUbuntuでC++を使用し、GCC 4.7でboost 1.46 [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秒間ハングさせたい。

16
Mahika

SleepはWindows関数です。

Unixの場合は、nanosleep(POSIX)またはusleep(BSD;非推奨)の使用を検討してください。

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>_が必要です。C++では_<ctime>_および_<cerrno>_として使用できます。

usleepの使用は簡単です(1000倍するだけなので、インライン関数にします)。ただし、一定時間スリープが発生することを保証することは不可能であり、非推奨であり、_extern "C" { }_- include _<unistd.h>_が必要です。

3番目の選択肢は、 http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntdll/sync.c#で見られるように、selectおよび_struct timeval_を使用することです。 l1204 (これはwineがSleepをエミュレートする方法であり、それ自体はSleepExの単なるラッパーです)。

sleep(小文字の 's')、その宣言は_<unistd.h>_であり、notは受け入れ可能な代替です、その粒度は秒で、WindowsのSleep(大文字の 's')の粒度よりも粗いため、粒度はミリ秒です。

2番目のエラーに関して、____XXXcall_はMSVC++固有のトークンです(___dllXXX_、___naked_、___inline_など)。 really stdcallが必要な場合は、__attribute__((stdcall))などを使用してgccでエミュレートします。

:コンパイルターゲットがWindowsバイナリでない場合and Win32 APIを使用している場合、stdcallの使用または要件Bad Sign™です。

24
moshbear

LinuxのC++プログラムでusleepを使用する方法:

これをs.cppというファイルに入れます

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

コンパイルして実行します。

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

「硝酸塩」を印刷し、1秒待ってから「肥料」を印刷しました

14
Eric Leschinski

私の場合、[〜#〜] s [〜#〜] leep and NOT s leep-非常に奇妙ですが、うまくいきました!

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");
}
_

usleep()を使用します。スリープと_unistd.h_を含めることを忘れないでください(Not cunistd

1
user8435497