18

我在 Ubuntu 中使用带有 codeBlocks 的 C++,在 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 秒钟。

4

5 回答 5

26

Sleep是一个 Windows 函数。

对于 Unix,请考虑使用nanosleep(POSIX) 或usleep(BSD; deprecated)。

一个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>

第三种选择是使用selectand struct timeval,如http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntdll/sync.c#l1204所示(这是 wine 模拟的方式Sleep,它本身只是SleepEx) 的包装。

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

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

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

于 2012-06-11T08:46:10.833 回答
16

如何在 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 秒,然后打印“过滤器”

于 2014-02-24T03:07:38.710 回答
3
#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 并且不要忘记包含unistd.h(Not cunistd)

于 2017-09-02T08:11:30.847 回答
1

就我而言,它有助于编写S leep 和 NOT s leep - 很奇怪,但有效!

于 2016-11-04T16:01:03.667 回答
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));
}
于 2020-10-27T10:56:03.310 回答