C++判断操作系统定义跨平台sleep函数

一,需求

 

虽然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
}

如果对文章有问题,或者改进的建议,欢迎私信~

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值