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>
。
第三种选择是使用select
and 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™。