我在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秒钟。
答案 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>
。
第三种选择是使用select
和struct 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)
将其放在名为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));
}