跨平台C、C++代码注意的事项
在我们的开发中,跨平台的需求越来越强烈,怎样保持C/C++代码能在多个平台上编译,是一个比較值得研究的问题。关于跨平台的文章网上非常多,跨平台的库网上也非常多。那么我从自己的跨平台开发经验谈一谈自己的心得。希望对大家可以起到一定的作用。
主要涉及到Windows和linux两个操作系统。
1、 关于路径和头文件路径分隔符的问题
在Windows中,正斜杠和反斜杠都能够。可是在Linux中,仅仅能是/。
在Windows中,路径大写和小写无所谓,在Linux中严格区分大写和小写。
2、 char的问题
假设考虑跨平台。须要明白指定是signed或者unsigned,由于不同平台直接声明char,会导致signed或者unsigned的不确定性。
3、 关于宽字符的问题。
在Windows中。wchar_t占两个字节,Linux中占四个字节,可是在Linux能够指定两个字节。这样也会造成一个问题,就是某些第三方库中wchar_t可能仅仅指定四个字节的。这样就会导致不兼容。
4、 Linux里面没有stricmp函数,在Linux以下是strcasecmp函数比較字符串。
5、 与平台相关的调用尽量用宏隔离开来。一般用不同的文件夹代表不同平台。BOOST、OGRE等是这样做,也能够再一个类或者文件里,这样会导致到处都是操作系统和编译器相关宏的定义。
6、 关于头文件包括
在Windows下某些C标准库的头文件不用显式包括,可是在linux下须要显式包括。所以在.c和.cpp文件里尽量包括这个文件里须要的头文件。
7、 注意机器大尾端和小尾端的差别
大小尾端对文件的读写会有非常大影响。要编写跨平台c++程序。大小尾端是必需要考虑的问题。比方。你在大尾端机器上写了一个文件,然后在小尾端机器上读取。那么结果肯定是错误的,所以,我们设计文件格式时,都需要规定文件是大尾端存储还是小尾端存储。或者一个文件里规定某些部分是大尾端某些部分是小尾端。
8、 尽量仅仅使用STL较早出现的函数或类
较早出现的东西相对来说比較稳定,STL的各个实现基本上都会有实现,这样跨平台的时候能够兼容多个平台。
9、 使用std::exception时须要注意。LINUX下是不支持抛出异常的,假设继承自标准库的异常类写自己的异常类的时候,在Linux下。子类的析构函数中就须要表明不抛出异常。所以析构函数后面加上throw()就能够了。
10、当继承模板类时。须要慎重
在自己的代码中,须要继承模板类时。假设须要訪问基类模板类的成员函数或者成员变量,前面加上this->。
另外,构造函数须要用到基类进行构造时。基类的类型须要须要用该类的类型參数初始化。否则在linux下会提示找不到基类的这个名字。
11、尽量使用标准C和C++的函数以及STL。使用C语言中定义的类型。
12、头文件反复包括的问题
尽量用保卫宏去实现防止头文件的反复包括,非常多代码在Windows下直接用#pragma once,这不能保证跨平台须要。
13、关于结构体对齐的问题。
CPU为了简化内存和CPU之间的处理以及加快CPU从内存中取数据的速度。往往都会做一定的对齐,即结构体的各个成员并非紧凑存储的,往往在成员中间填充一些字节。所以,我们一般不推荐用结构体直接读取和写入数据,这样在不同系统或者计算机之间进行移植时,会出现错误的结果。
14、注意BOM的陷阱(字节顺序标记)
假设你在Windows用记事本创建一个源文件。那么Windows会在文件最前面加上一个BOM标记。即所谓的字节顺序标记,这种源代码在Windows下没问题,可是在Linux下就编译只是,所以须要用其它的文本编辑器或者直接在VS里面创建源文件。
Linux下gcc/g++不认带BOM标记的源文件。
15、注意调用函数时的形參类型和函数声明中參数列表的类型不匹配。这里特指有无const或者是否是引用參数。在Windows下的cl编译器没问题,linux下GCC/G++会报错。
16、注意两个尖括号不要连着写。比如std::vector<std::vector<int>> vec;在Windows下这么写全然没问题,那么在linux下就是编译只是,所以linux下能够在连续两个尖括号符号之间留一个空格,即std::vector<std::vector<int> > vec;
事实上。这些仅仅是冰山一角。在跨平台C/C++开发上还须要做很多其它的探索。
跨平台C、C++代码注意的事项的更多相关文章
- 如何编写跨平台的Java代码
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- 跨平台C++开源代码的两种常用编译方式
作者:朱金灿 来源:http://blog.csdn.net/clever101 跨平台C++开源代码为适应各种编译器的编译,采用了两种方式方面来适配.一种是makefile方式.以著名的空间数据格式 ...
- Gerrit评审代码流程注意事项
Gerrit管理CR流程时要注意下面两大事项: (一)格式规范 这部分主要是根据公司或者团队的要求规范来撰写格式,这里不做统一介绍了:格式规范的宗旨是让修改的代码和业务需求能够匹配.可追溯. (二)评 ...
- MySQL 代码开发注意事项----开发高性能的sql
序言 一个服务或者一个程序,由 程序+数据组成.在数据这块,计算机中IO是比CPU要慢得多,为了减少IO,减少CPU运算.我们第一时间会想到索引,但索引为啥会提高效率,因为可以减少IO,在查询的时候不 ...
- Android项目外接高德地图代码混淆注意事项
如今好多项目中都加入了第三方jar包,可是最大的问题就是打包的时候代码混淆报错,下面是高德地图混淆报错解决方式: 在proguard-project.txt中加入例如以下代码: -libraryjar ...
- 实现Java程序跨平台运行十二个注意事项
[转自] http://blog.chinaunix.net/uid-20550186-id-1927257.html 使用Java语言编写应用程序最大的优点在于"一次编译,处处运行&quo ...
- 【持续更新】把.net代码转换为java代码的注意事项
国内大多数大学的软件相关专业大多强制学生学习c和Java,但.net 的几个语言可以说是选学的. 由于visual studio在windows平台上使用相对方便,一些同学会在上大学的Java课之前自 ...
- PHP 代码编写注意事项总结归纳
1- 编写模块化代码 良好的PHP代码应该是模块化代码.PHP的面向对象的编程功能是一些特别强大的工 具,可以把你的应用程序分解成函数或方法.你应该尽可能多的从你的应用程序的服务器端分开前端的HTML ...
- 编写Python代码的注意事项
1.标识符 标识符是定义的名称,包括类名.变量名等等 标识符的大小写是敏感的,且第一个字符必须是字母表中的字母或"_" 在python3中,中文可被用作变量名 不能使用Python ...
随机推荐
- [Windows Server 2012] 更改服务器密码
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★[护卫神·V课堂]是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:更改服务器 ...
- GPC:使用GPC计算intersection容易出现的问题
在使用GPC计算多边形的交的时候,出现问题 //1.2. 另一种方法,判断新的多边形是否和老多边形相交 Poly cross = (PolyDefault) Clip.intersection ...
- (转)Hibernate框架基础——一对多关联关系映射
http://blog.csdn.net/yerenyuan_pku/article/details/52746413 上一篇文章Hibernate框架基础——映射集合属性详细讲解的是值类型的集合(即 ...
- (转)版本管理工具介绍——SVN篇(二)
http://blog.csdn.net/yerenyuan_pku/article/details/72620498 上一篇文章我介绍了一下SVN,以及SVN服务器的安装,相信大家都安装了,接下来我 ...
- CAD绘制多行文字
在CAD设计时,需要绘制多行文字,用户可以设置设置绘制文字的高度等属性. 主要用到函数说明: _DMxDrawX::DrawMText 绘制一个多行文字.详细说明如下: 参数 说明 DOUBLE dP ...
- vue-quill-editor + element-ui upload实现富文本图片上传
代码贴上 <template> <div class="quill-editor-example"> <div class="box&quo ...
- luogu P4172 [WC2006]水管局长 LCT维护动态MST + 离线
Code: #include<bits/stdc++.h> #define maxn 1200000 #define N 120000 using namespace std; char ...
- Linux常用命令——压缩与解压缩命令
常用压缩格式: .zip .gz .bz2 .tar.gz .tar.bz2 1..zip格式压缩 zip 压缩文件名 源文件 压缩文件 zip -r 压缩文件名 源目录 压缩目录 ...
- Windows下运行jekyll,编码已不再是问题
很久没更新jekyll了,所以好奇着去官网看了下更新记录,发现如下更新条目(版本1.3.0/2013-11-04发布): Add encoding configuration option (#144 ...
- 小程序button默认样式透彻理解
微信小程序有一个默认样式,特别是有一个外边框,虽然看起来不别扭,但是自己每次设置border:0:都不生效,写成内联的样式也不生效,后来才知道里面的边框是伪元素的边框,这里的伪元素可以理解为用css动 ...