编写C语言跨平台函数(以清屏和休眠函数为例)
支持C语言的平台有许多,常见的编译器如VC、gcc、Clang等。不同的编译器共同点是都支持标准C(ANSI C),但是各自却又有自己独立的、平台相关的功能以及函数接口。这通常为程序的移植性带来很多问题。这里我简单谈一下解决方案。
常见思路
常见的解决跨平台移植的思路就是利用 宏。不同编译器有各自不同的宏,宏有很多,具体可以参考编译器的相关手册。通过判断一个宏是否存在来选择性的包含头文件或调用函数,其本质就是一种条件编译。
比如一些平台相关的函数,在不同平台要包含不同文件。
#if defined __GNUC__
#include <unistd.h>
#elif defined _MSC_VER
#include <windows.h>
#endif
#if defined 在本例中也可以用#ifdef 替换,但是如果是复杂的条件编译(比如if后面同时判断多个宏),就只能用#if defined 实现了。
__GNUC__
是在gcc编译器中定义的宏,_MSC_VER
是Windows中VC编译器中的宏。当然了你还可以选择这两个编译器中的其他宏来实现这一功能,只要能确保是两个编译器中平台相关的宏就行。
_MSC_VER
这个宏还能判断VC的版本。比如:
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
...
它的意思是如果VC的版本大于VC 6.0,那么...
该宏的详细参考,很容易百度到:
- MS VC++ 12.0 _MSC_VER = 1800 (Visual C++ 2013)
- MS VC++ 11.0 _MSC_VER = 1700 (Visual C++ 2012)
- MS VC++ 10.0 _MSC_VER = 1600(Visual C++ 2010)
- MS VC++ 9.0 _MSC_VER = 1500
- MS VC++ 8.0 _MSC_VER = 1400
- MS VC++ 7.1 _MSC_VER = 1310
- MS VC++ 7.0 _MSC_VER = 1300
- MS VC++ 6.0 _MSC_VER = 1200
- MS VC++ 5.0 _MSC_VER = 1100
跨平台函数的栗子
清屏函数
同样的思路。我们也可以把条件编译用在函数内部。比如要实现控制台的清屏功能,VC中的通常做法是这条语句system("cls")
;调用控制台的cls命令来清屏。而Linux环境下,给终端清屏是没有cls这一命令的,取而代之的是clear命令。那么如何实现跨平台的清屏功能呢?很简单,依样画葫芦:
void clear()
{#ifdef __GNUC__system("clear");#elif defined _MSC_VERsystem("cls");#endif
}
这样就有了跨平台的清屏函数clear。但是其实关键都是system函数,两个平台都提供这个函数(system是标准 C里面的函数)。所以可以再改一版。
#if defined __GNUC__
char *clear = "clear";
#elif defined _MSC_VER
char *clear = "cls";
#endif
...
//当需要清屏的时候
system(clear);
休眠函数
无论是gcc还是VC都有休眠函数,不过具体函数接口却不同。
编译器 | 头文件 | 函数名 | 参数类型 | 描述 |
---|---|---|---|---|
VC | windows.h | Sleep | unsigned | 参数为要休眠的毫秒数 |
gcc | unistd.h | sleep | unsigned | 参数为要休眠的秒数 |
gcc | unistd.h | usleep | unsigned | 参数为要休眠的微秒数 |
可见,两种环境下的休眠函数的函数名并不相同。并且gcc的两个sleep函数并没有没有提供毫秒级的分辨率。也就是说,比如要休眠200毫秒:
- Windows中:Sleep(200);
- Linux中:usleep(200000);
1秒=1000毫秒,1毫秒=1000微秒
那么来实现一下跨平台的休眠功能,我提供一种我的方案:
#if defined __GNUC__
#include <unistd.h>
#define Sleep(x) usleep(x##000)
#elif defined _MSC_VER
#include <windows.h>
#endif
这样即使在gcc的编译环境下,我们也有和VC中一样的Sleep函数可以用了。这里我是用宏函数来实现的。#define Sleep(x) usleep(x##000)
##是宏定义里面的连接符,这样就默认给参数后面多加了三个0,即扩大了1000倍。
gcc 的宏连接符(##)后面不支持连接+ - * /,所以不能写成
#define Sleep(x) usleep(x##*1000)
不过VC支持##后面接+ - * /符号。
掷骰子游戏
现在,来综合一下刚才的两个函数:清屏和休眠。写一个掷骰子小游戏的demo。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>#ifdef __GNUC__
#include<unistd.h>
char *clear = "clear";
#endif
#ifdef _MSC_VER
#include<windows.h>
char *clear = "cls";
#endifint a[3];
//判断是否为顺子
int isShunzi()
{int max=a[0],min=a[0],sum=a[0];for(int i=1;i<3;i++){if(a[i]>max)max=a[i];if(a[i]<min)min=a[i];sum+=a[i];}int mid=sum-max-min;if(mid-min==1&&max-mid==1)return 1;return 0;
}int main()
{srand((unsigned)time(NULL));int t=40;//随机40次后结束while(t--){Sleep(200);system(clear);a[0] = rand()%6+1;a[1] = rand()%6+1;a[2] = rand()%6+1;printf("骰子1的点数为:%d\n",a[0]);printf("骰子2的点数为:%d\n",a[1]);printf("骰子3的点数为:%d\n",a[2]);}if(a[0]==a[1]&&a[0]==a[2])printf("您掷出的是豹子\n");else if(isShunzi())printf("您掷出的是顺子\n");else if(a[0]+a[1]+a[2]>=11)printf("您的点数是大\n");elseprintf("您的点数是小\n");}
编写C语言跨平台函数(以清屏和休眠函数为例)相关推荐
- c语言休眠函数 vs,编纂C语言跨平台函数(以清屏和休眠函数为例)
编写C语言跨平台函数(以清屏和休眠函数为例) 支持C语言的平台有许多,常见的编译器如VC.gcc.Clang等.不同的编译器共同点是都支持标准C(ANSI C),但是各自却又有自己独立的.平台相关的功 ...
- 清屏函数 mysql_c++清屏函数是什么
c++清屏函数是"system("cls")".system()是一个C/C++的函数,功能是发出一个DOS命令:当该函数的参数为"cls" ...
- C语言各种编译器的清屏方法
1,vs/vc:vs本身并没有提供专用清屏的函数,但是清屏被作为windows专用的可执行程序了,因此可以使用system("cls")来手动开启进程完成清屏. 2,tc:清屏函数 ...
- C语言关于windows下清屏
#include <windows.h> static void SetPos(int x, int y) { COORD point = { x, y };//光标要设置的位置x,yHA ...
- C语言:跨平台环境下使用snprintf,vsnprintf系列函数要注意返回值的问题
标准C语言函数snprintf,vsnprintf系列函数可以向指定的缓冲区输出格式化打印的字符串. 如果指定的缓存区足够大,那么调用正常,返回值就是写入缓存区的字节长度(不含结尾'\0') 那么缓存 ...
- c语言 倒计时不清屏_c语言中如何只清屏后半部分保留前半部分?
满意答案 fcukpwyg 2013.11.05 采纳率:50% 等级:12 已帮助:5911人 问题太多了,我只作了第一个,这个程序可以实现加减乘除指数运算,支持所有双精度型数据~~~~~~好 ...
- Java如何实现清屏(Cmd版)
Java如何实现清屏(CMD版) 参照: 更新时间:2018年05月26日 09:45:57 作者:雅钧 JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和 ...
- python怎么清屏_python怎么清屏
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我试图用python编写一个程序,但是我不知道如何清除屏幕. 我同时使用wind ...
- java jni清屏_java使用jni清屏(只针对cmd)
在java中没有提供清屏的接口,所有可以通过jni调用c语言的system("cls")清屏.当然,仅限于cmd清屏,不支持eclipse的控制台console清屏. 步骤: 1. ...
最新文章
- 今晚8点免费直播 | 详解知识图谱关键技术与应用案例
- 实现一个正则表达式引擎in Python(三)
- 2010年5月系统集成项目管理工程师上午试卷参考答案(讨论版)
- java国际化——日期和时间+排序
- React开发(204):react代码分割之路由懒加载
- 数据分析专题报告范文6篇_小学生看图写话范文:小熊玩跷跷板?(6篇),让孩子参考练习...
- Python爬虫番外篇之Cookie和Session
- Java实现文件复制
- 美团酒旅数据治理实践
- Oracle物化视图和普通视图区别
- 在 Libra 刷屏的背后,你必须知道 TA!
- dispatch作用 react_javascript – redux-react中的dispatch函数
- CF - 472C. Design Tutorial: Make It Nondeterministic 贪心
- php 图片后缀,php获取图片格式(图片后缀)
- win7开机密码_win7忘记开机密码怎样才能打开电脑?别再用那些错误的方法了
- vscode 中 php 代码格式化插件和其他设置
- MPP(高斯DB)常用语句(不定时更新添加)
- Golang lua交互——gopher-lua中call函数使用
- 如何在忙碌之余学习数据科学?
- Word中单倍行间距是多少磅
热门文章
- 闲暇时间不知道如何有效利用,TapTap、触漫等五款软件帮你解决
- 自适应模糊PID在反应釜温度控制中的应用
- 20140417本人分别用12种编程语言编写的MasterSeeker热键辅助工具软件[晓亮原创]
- asm磁盘头自动备份19c-au11
- “德阳造”水上智能清污机器人 一次可收集500公斤垃圾
- Balsamiq 介绍
- 微信公众号中,怎么插入代码块?(微信公众号中,代码块怎么排版?)
- 路由器配置(新手上路,比较全面,强烈推荐)
- pdf转换成jpg转换器的使用方法
- Gut:中国药科大学周伟等团队在肠道菌群驱动风湿性关节炎机制研究和中药干预方面取得新进展...