我相信学过C语言的同学,都会在书中看到C语言特点一定有:可移植性。但是什么是可移植?如何才能可移植?C语言是如何做到可移植的?对于初学者,可移植可能是一个经常遇到却很神秘的词。我想通过这篇文章来表达我对于可移植性的一些想法。

首先,在这里铺垫一下。学过Win32程序设计的人肯定都听说过API(Application Program Interface)。我就先说说API,高手绕过。API对于程序员来说就是系统提供的接口,任何涉及系统调用都要通过API来完成。对于不同的操作系统都有不同的一套API,也就是说对于不同的操作系统系统调用的接口是完全不同的。所以在API层我们是不能移植的。

下面我就来说说可移植,可移植顾名思义就是可以从一个平台移植到另外一个平台,但是大家一定要清楚,移植是基于操作系统的。但是这个时候,我们需要注意一点:基于各种操作系统平台不同,应用程序在二级制级别是不能直接移植的。我们只能在代码层去思考可移植问题,在API层面上由于各个操作系统的命名规范、系统调用等自身原因,在API层面上实现可移植也是不大可能的。那怎么才能实现可移植呢?

我们首先来看看现在主流的Windows和Linux平台下代码可移植性。有什么办法解决这个问题呢?答案是:在各个平台之间,基于大部分需求抽象出一个中间层。在中间层中,中间层用了屏蔽底层细节,在我们程序员看来C言语库就是这样一个中间层的作用。在各个平台下,我们默认C标准库中的函数都是一样的,这样基本可以实现可移植。但是对于C库本身而言,在各种操作系统平台下其内部实现是完全不同的,也就是说C库封装了操作系统API在其内部的实现细节。

因此,C语言提供了我们在代码级的可移植性,即这种可移植是通过C语言这个中间层来完成的。

当然,大家都可以看出上面的可移植是有条件的,C语言本身不能实现完全的可移植,为什么呢?因为,在我们程序中,我们经常会调用系统API,由于这些API在C语言中没有对其封装,所以我们只能用使用其原始的API,对于原始的API在各个操作系统中他们命名不同,就不能跨平台移植。所以,我们要写出完完全全的跨平台的程序,还是需要其他的一些手段。例如在我们的代码中下功夫。以下代码可以帮助我们实现各平台之间的可移植:

#ifndef _WINDOWS_

CreateThread();      //windows下线程的创建

#else

Pthread_create();    //Linux下线程的创建

#endif

对于头文件,也使用同样的预编译宏来实现。如:

#ifndef _WINDOWS_

#include <windows.h>

#else

#include <thread.h>

#endif

这样就可以实现代码的可移植了。在编译的时候只要通过#define就可以选择在那个平台下完成程序的编译。

综上所述,我们都是将C,C++等各种语言当作中间层,以实现其一定程度上的可移植。如今,语言的跨平台的程序都是以这样的方式实现的。但是在不同的平台下,仍需要重新编译。

新博客地址:http://van.nxspace.cn

转载于:https://blog.51cto.com/vanshell/417068

对于C语言可移植性的思考相关推荐

  1. 学习C语言你是否思考过表达式11111*11111的值是多少?把5个1换成6个1呢?9个1呢?...

    学习C语言你是否思考过表达式11111*11111的值是多少?把5个1换成6个1呢?9个1呢?请看到这还不理解我想说什么的朋友自行编写代码实现一下,就会有特别深刻的印象了. 解决方案:编写程序模拟笔算 ...

  2. java语言是可移植的_保证Java语言可移植性的特征是()_学小易找答案

    [单选题]如果知觉不具有( ),那么人就难以适应吮吸万变的外界环境 [单选题]知觉的( )提高了人们迅速知觉事物的能力. [单选题]食管胃底静脉曲张患者应选择 [单选题]"入芝兰之室久而不闻 ...

  3. c语言可移植性较差吗,c陷阱与缺陷--可移植性缺陷

    引入 c语言是比较底层的语言,相对于c++和java等高级语言而言.c语言在许多不同的系统平台上都有各自的实现,由于各自的实现之间有细微的差别,导致了如今的移植性问题. 在书中说到,由于程序的生命期一 ...

  4. 关于复杂系统思想与语言研究的思考

    怎么开始读到<复杂--诞生于秩序与混沌边缘的科学>这本已经记不起来,但是这本书中描述的现象,展现的圣塔菲研究中心的工作,以及取得的阶段性成果给我相当大的震撼.横跨经济学.分子生物学.凝聚态 ...

  5. 【原创】关于Golang和Rust对比及语言的选择思考

    作为现在已经作为互联网企业高性能API标配的Go语言,以及在成长路上的Rust语言,都是互联网后端工程师重要选择的两个语言,也是很多人拿来做对比的两个语言,那么实际场景里应该如何选择呢. 没有万能的语 ...

  6. c语言猜拳游戏思考,这是一个猜拳游戏的程序 大家有更好的解决方法么?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include /* 显示程序的使用方法 */ void help() { printf("Usage : \nFind and/or rep ...

  7. 工作流引擎被各种开发语言调用的思考

    我有了一个engine,C#做的.对于asp.net,可以直接add reference即可.对于smartclient方式的,通过webservice来call后台的component,compon ...

  8. C++/Python/Java/C,四大语言对比,你更喜欢哪种?

    现如今,互联网时代已经是风生水起,IT技术人才更是层出不穷.但学习在精不在多,总要有一方面精通才是自己的资本.面对众多的编程语言,Java.C语言.C++.Python等编程,你更喜欢哪种? 虽说C语 ...

  9. c生万物之初识c语言

    c生万物之初识c语言 前言: 1.初学习了c语言,感觉还是很不错的,哈哈~~.下面让我来分享下我目前对c的认识 题外:后面有关于c语言风格培养的<高质量的c-c++编程>PDF版链接,有需 ...

最新文章

  1. javax.jdo.JDODataStoreException: Required table missing : “`VERSION`“ in Catalog ““ Schema ““.
  2. 网络管理人员的未来?
  3. 修改图片src_【学习园地】企业SRC搭建
  4. Mybatis Generator 逆向生成器
  5. 2015/8/29 Python基础(3):数值
  6. radware alteon 负载均衡器设置
  7. Oracle中UNION和ORDER BY共用方法
  8. ubutun 干净卸载删除deepin-wineQQ
  9. Ubuntu下F2FS文件系统的安装与挂载
  10. 机器视觉中常用图像处理库都有哪些?
  11. autoCAD 使用图层、颜色和线型
  12. 领英给好友群发消息的方法和细节
  13. 区块链技术的应用有哪些?
  14. VC浏览器相关的学习(七)(BHO捕获鼠标键盘事件)
  15. PTA 【java】7-2 将数组中的数逆序存放 (20 分)
  16. 多线程---详解各种锁和AQS原理
  17. SJTU 《综合英语一》备考题
  18. 彪哥情人节期间征女友一名铃声 彪哥情人节期间征女友一名手机...
  19. 为华生物PCL-NH2 聚己内酯氨基的简介及应用说明
  20. 山东自贸区建设应全力发展新经济——访新经济专家陈宗建

热门文章

  1. 数据结构上机实践第八周项目3-顺序串算法
  2. (03)两个模型的交集、并集、差集
  3. java 上界和下界,Java 泛型上下界(上下限)
  4. 非root用户安装mysql_linux非root用户安装5.7.27版本mysql
  5. perl和python的相互调用
  6. windows下python 自动截图功能
  7. java 结果用长整数型表示_java 编程 输入正整数n,计算n!结果用长整型数表示
  8. linux系统如何切换语言环境变量,Linux系统中如何修改某用户语言环境变量
  9. matlab中svm testacc参数,使用Matlab进行交叉验证的多类SVM的完整示例
  10. ssh密钥登录 改密码登录_如何使用密钥对通过SSH登录而不使用密码