簡體   English   中英

C++ 錯誤:未在此范圍內聲明睡眠

[英]C++ error : Sleep was not declared in this scope

我在 Ubuntu 中使用 C++ 和 codeBlocks,在 GCC 4.7 中提升 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 秒鍾。

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>

第三種選擇是使用selectstruct timeval ,如http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntdll/sync.c#l1204 中所見(這是 wine 模擬的方式Sleep ,它本身只是SleepEx的包裝器)。

注意sleep (小寫 's'),其聲明在<unistd.h>不是可接受的替代品,因為它的粒度是秒,比 Windows 的Sleep (大寫 's')粗,后者有一個粒度毫秒。

關於您的第二個錯誤, ___XXXcall是 MSVC++ 特定的標記(與__dllXXX__naked__inline等一樣)。 如果您確實需要 stdcall,請使用__attribute__((stdcall))或類似方法在 gcc 中模擬它。

注意:除非您的編譯目標是 Windows 二進制文件並且您使用的是 Win32 API,否則stdcall使用或要求是 A Bad Sign™。

如何在 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 秒,然后打印“過濾劑”

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

使用usleep() Insted of sleep 並且不要忘記包含unistd.h (不是cunistd

就我而言,它有助於編寫S leep 而不是s leep - 非常奇怪,但有效!

使用std::this_thread::sleep_for()

#include <chrono>
#include <tread>


int main(int argc , char *argv[])
{       
    std::this_thread::sleep_for(std::chrono::seconds(2));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM