当前位置:天才代写 > tutorial > C语言/C++ 教程 > C++的可移植性和跨平台开拓[5]:操纵系统

C++的可移植性和跨平台开拓[5]:操纵系统

2017-11-03 08:00 星期五 所属: C语言/C++ 教程 浏览:864

上一个帖子提到了"硬件体系"相关的话题,本日来说说和操纵系统相关的话题 。C++跨平台开拓中和OS相关的琐事挺多,所以本日会烦琐较量长的篇幅,请各位看官留情 🙂

为了不绕口,以下把Linux和各类Unix统称为Posix系统。

★文件系统(FileSystem以下简称FS)

刚开始搞跨平台开拓的新手,多数城市碰上和FS相关的问题。所以先来聊一下FS。归纳下 来,开拓中容易碰上的FS差别主要有如下几个:目次脱离符的差别;巨细写敏感的差别;路 径中禁用字符的差别。

为了应对上述差别,你要留意如下几点:

1、文件和目次定名要类型

在给文件和目次定名时,只管只利用字母和数字。不要在同一个目次下放两个名称相似( 名称中只有巨细写差异,譬喻foo.cpp与Foo.cpp)的文件。不要利用某些OS的保存字(譬喻 aux、con、nul、prn)作文件名或目次名。

增补一下,适才说的定名,包罗了源代码文件、二进制文件和运行时建设的其它文件。

2、#include语句要类型

当你写#include语句时,要留意利用正斜线"/"(较量通用)而不要利用反斜 线"\"(仅在Windows可用)。#include语句中的文件和目次名要和实际名称保持 巨细写完全一致。

3、代码中涉及FS操纵,只管利用现成的库

已经有许多成熟的、用于FS的第三方库(好比boost::filesystem)。假如你的代码涉及 到FS的操纵(好比目次遍历),只管利用这些第三方库,可以帮你省不少工作。

★文本文件的回车CR/换行LF

由于几个知名的操纵系统对回车/换行的处理惩罚纷歧致,导致了这个烦人的问题。今朝的局 面是:Windows同时利用CR和LF;Linux和大部门的Unix利用LF;苹果的Mac系列利用CR。

对付源代码打点,亏得许多版本打点软件(好比CVS、SVN)城市智能地处理惩罚这个问题,让 你从代码库取回当地的源码能适该当地的名目。

假如你的措施需要在运行时处理惩罚文本文件,要寄望本文方法打开和二进制方法打开的区别 。别的,假如涉及跨差异系统传输文本文件,要思量举办适当的处理惩罚。

★文件搜索路径(包罗搜索可执行文件和动态库)

在Windows下,假如要执行文件可能加载动态库,一般会搜索当前目次;而Posix系统则不 尽然。所以假如你的应用涉及到启动历程或加载动态库,就要小心这个差别。

★情况变量

对付上述提到的搜索路径问题,有些同学想通过修改PATH和LD_LIBRARY_PATH来引入当前 路径。如果利用这种要领,发起你只修改造程级的情况变量,不要修改系统级的情况变量( 修改系统级有大概影响到同机的其它软件,发生副浸染)。

★动态库

假如你的应用措施利用动态库,强烈发起动态库导出尺度C气势气魄的函数(只管不要导出类 )。假如在Posix系统中加载动态库,切记慎用RTLD_GLOBAL符号位。这个符号位会Enable全 局标记表,有大概会导致多个动态库之间的标记名斗嘴(一旦遇到这种事,会呈现匪夷所思 的运行时错误,极难调试)。

关于动态库的话题较量大,限于篇幅,今后单独写一个帖子接头。

★处事/看管历程

假如你不清楚处事和看管历程的观念,请看维基百科(这里和这里)。为了论述利便,以 下统称处事。

由于C++开拓的模块大部门是靠山模块,常常会碰随处事的问题。编写处事需要挪用好几 个系统相关的API,导致了与操纵系统的细密耦合,很难用一套代码搞定。因此较量好的步伐 是抽象出一个通用的处事外壳,然后把业务逻辑代码作为动态库挂载到它下面。这样的话, 至少担保了业务逻辑的代码只需要一套;处事外壳的代码固然需要两套(一个用于Windows、 一个用于Posix),但他们是业务无关的,可以很利便地重用。

★默认栈巨细

差异的操纵系统,栈的默认巨细不同很大,从几十KB(听说Symbian只有12K,真抠门)到 几MB不等。因此你事先要探询一下方针系统的默认栈巨细,假如碰上像Symbian这样抠门的, 可以思量用编译器选项调大。虽然,养成"不在栈上界说大数组/大工具"的好习惯 也很重要,不然再大的栈也会被撑爆的。

 

    关键字:

天才代写-代写联系方式