栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 

int main(){
    Sleep(1000); // win是以毫秒为单位的
    return 0;
}

linux/unix:

#include 

int 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
}

 

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

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1030788.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号