C ++错误:未在此范围内声明Sleep

时间:2012-06-11 07:45:09

标签: c++ linux ubuntu gcc boost

我在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秒钟。

5 个答案:

答案 0 :(得分:24)

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" { } - 包括<unistd.h>

第三种选择是使用selectstruct timeval,如http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntdll/sync.c#l1204中所示(这就是葡萄酒模仿Sleep的方式,SleepEx本身只是{{{{}}的包装。 1}})。

注意sleep(小写's'),其声明位于<unistd.h>是可接受的替代品,因为它的粒度是秒,比Windows'Sleep(大写's')更粗糙,其粒度为毫秒。

关于第二个错误,___XXXcall是特定于MSVC ++的令牌(__dllXXX__naked__inline等等。如果确实需要stdcall,请使用__attribute__((stdcall))或类似内容在gcc中模拟它。

注意:除非您的编译目标是Windows二进制文件并且您正在使用Win32 API,否则stdcall的使用或要求是一个坏标志™。

答案 1 :(得分:13)

如何在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秒,然后打印出“firtilizers”

答案 2 :(得分:1)

在我的情况下,它有助于写出 S leep而不是 s leep - 非常奇怪,但有效!

答案 3 :(得分: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()睡眠和忘记包括unistd.h (不是cunistd

答案 4 :(得分:0)

使用std::this_thread::sleep_for()

#include <chrono>
#include <tread>


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