[英]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>
。
第三種選擇是使用select
和struct 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™。
把它放在一個名為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.