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

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

私は、GCC 4.7 [ yield_k.hpp ] で codeBlocks、boost 1.46 を使って Ubuntu で C++ を使用しています。

コンパイル時に次のエラーが発生します:

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; 非推奨) の使用を検討してください。

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つ目の選択肢は、selectと を使用することです。struct timevalhttp://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntdll/sync.c#l1204(これはSleep、 自体は のラッパーにすぎない をwine がエミュレートする方法ですSleepEx)。

注記: sleep(小文字の's')は、宣言が で行われ<unistd.h>ない粒度が秒単位であるため、Windows のSleepミリ秒単位 (大文字の 's') よりも粗く、許容できる代替手段です。

2番目のエラーについては、___XXXcallはMSVC++固有のトークンです(、、__dllXXXなど)。__naked__inline本当にgcc でエミュレートするには、 stdcall、use__attribute__((stdcall))などが必要です。

注記: コンパイル対象がWindowsバイナリでない限りそしてWin32 API を使用している場合、 の使用または の要件はstdcallA Bad Sign™ です。

おすすめ記事