一,需求
虽然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:
#include <windows.h>
int main(){
Sleep(1000); // win是以毫秒为单位的
return 0;
}
linux/unix:
#include <unistd.h>
int main(){
uleep(1000000); // unix/linux是以微秒为单位的
return 0;
}
了解了sleep函数,和判断操作平台的方法后,我们就可以着手定义跨平台的sleep函数了。
建议大家先看到这里,自己着手试一试,在看下面的代码实现。
六,代码实现
我们先判断操作系统来确定我们是包含windows.h还是unistd.h
// 判断操作系统
#ifdef _WIN32 // 如果有预定义宏常量_WIN32则为windows
#include <windows.h>
#else
#include <unistd.h> // 否则是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 <iostream>
// 判断操作系统
#ifdef _WIN32 // 如果有预定义宏常量_WIN32则为windows
#include <windows.h>
#else
#include <unistd.h> // 否则是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
}
如果对文章有问题,或者改进的建议,欢迎私信~