虽然C++的自带库中并没有定义好可以让程序或线程暂停的sleep函数,但是在各个操作系统的官方库中还是有这个函数的,windows下就要包含windows.h头文件,而基于unix或linux就需要unistd.h头文件。
二,问题注:Mac os是基于unix的操作系统!
如果我们的程序直接将我们自己操作系统的库#include直接使用的话,我们的程序在其他操作平台上就会出现报错的情况。所以,为了方便我们跨平台编程,需要自己定义一个跨平台的sleep函数。
三,#ifdef语法四,各平台编译器自带的宏常量#ifdef-#elif-#else-#endif可以判断是否定义了某个宏,同时有#ifndef判断是否没有定义某个宏
#ifdef NAME #do #elifdef NAME2 #do #else #do #endif大概的语法是这样的,如果要深入了解此用法,推荐访问:#ifdef 语句使用方法_'Sven的博客-CSDN博客_ifdef
我们刚刚学习了#ifdef语法,它可以判断是否定义了某个宏,我们只要使用#ifdef判断编译器自带的平台常量是否被定义即可判断操作平台了。
接下来是基于操作系统定义的宏常量列表:
注意判断iOS时要先判断__APPLE__并包含TargetConditionals.h后才可判断iOS的宏常量。
五,各平台sleep函数windows:
#includeint main(){ Sleep(1000); // win是以毫秒为单位的 return 0; }
linux/unix:
#includeint main(){ uleep(1000000); // unix/linux是以微秒为单位的 return 0; }
了解了sleep函数,和判断操作平台的方法后,我们就可以着手定义跨平台的sleep函数了。
建议大家先看到这里,自己着手试一试,在看下面的代码实现。
六,代码实现我们先判断操作系统来确定我们是包含windows.h还是unistd.h
// 判断操作系统 #ifdef _WIN32 // 如果有预定义宏常量_WIN32则为windows #include#else #include // 否则是unix/linux #endif
接下来就可以定义函数了,我们同样判断一下操作系统宏,来确定我们是调用Sleep函数还是usleep函数。
void sleep_cp(unsigned int seconds){
#ifdef _WIN32
Sleep(seconds * 1000); // windows下的Sleep函数是以毫秒为单位的
#else
usleep(seconds * 1000000); // unix/linux下的usleep函数是以微秒为单位的
#endif
}
这里我函数的参数是以秒为单位的,大家可以自行修改,只要修改一下Sleep或者usleep函数调用时的计算即可。注意不能用1e6这样的科学计数法,否则会缩小转换。
结合一下完整的代码,就可以快乐的使用了~:
#include// 判断操作系统 #ifdef _WIN32 // 如果有预定义宏常量_WIN32则为windows #include #else #include // 否则是unix/linux #endif // function prototype void sleep_cp(unsigned int seconds); int main(){ using namespace std; cout << "等一秒" << endl; sleep_cp(1); cout << "一秒后" << endl; return 0; } void sleep_cp(unsigned int seconds){ #ifdef _WIN32 Sleep(seconds * 1000); // windows下的Sleep函数是以毫秒为单位的 #else usleep(seconds * 1000000); // unix/linux下的usleep函数是以微秒为单位的 #endif }
如果对文章有问题,或者改进的建议,欢迎私信~



