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

Mah*_*ika 16 c++ linux ubuntu gcc boost

我在Ubuntu中使用C++和codeBlocks,在GCC 4.7中使用1.46 [yield_k.hpp]

我得到这个编译时错误:

error : Sleep was not declared in this scope
Run Code Online (Sandbox Code Playgroud)

码:

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

我该如何解决这个错误?我希望程序挂起1秒钟.

mos*_*ear 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

您将需要<time.h><errno.h>以C++的形式提供as <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)

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

关于第二个错误,___XXXcall是一个MSVC++ -特定的令牌(因为是__dllXXX,__naked,__inline,等等).如果你真的需要stdcall,使用__attribute__((stdcall))或者类似于在gcc中模拟它.

注意:除非您的编译目标是Windows二进制文件并且您使用的是Win32 API,否则使用或要求stdcall是Bad Sign™.


Eri*_*ski 15

如何在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;
}
Run Code Online (Sandbox Code Playgroud)

编译并运行它:

el@defiant ~/foo4/40_usleep $ g++ -o s s.cpp
el@defiant ~/foo4/40_usleep $ ./s
nitratefirtilizers
Run Code Online (Sandbox Code Playgroud)

它打印出"硝酸盐",等待1秒,然后打印出'firtilizers'

  • `#include &lt;unistd.h&gt;` 解决了我遇到的问题,谢谢! (3认同)