跨平台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++开发上还须要做很多其它的探索。

时间: 2024-10-20 19:15:13

跨平台C、C++代码注意的事项的相关文章

跨平台C++开源代码的两种常用编译方式

作者:朱金灿 来源:http://blog.csdn.net/clever101 跨平台C++开源代码为适应各种编译器的编译,采用了两种方式方面来适配.一种是makefile方式.以著名的空间数据格式解析库gdal为例,它就是提供了makefile来供各种编译器来编译.gdal主要提供了微软的VC编译器和GNU GCC编译器两种格式的makefile,在gdal的源码根目录可以找到makefile.vc和GNUmakefile两个makefile文件,其中makefile.vc为vc编译器的ma

使用SVN钩子运行PHP更新服务器代码的注意事项

想通过本地提交代码到SVN服务器,同时同步测试服务器的代码 使用SVN钩子,运行服务器的php文件 代码如下: <?php header("Content-Type: text/html; charset=utf-8"); header("Cache-Control:no-cache,must-revalidate"); $username = '用户名'; $password = '密码'; $target_dir = '路径'; exec("su

java之路 构造代码块注意事项

1 /* 2 构造代码块: 3 4 构造代码块的作用:给对象进行统一的初始化. 5 6 构造函数的作用: 给对应的对象进行初始化. 7 8 9 构造代码块的格式: 10 11 { 12 构造代码块 13 } 14 15 注意: 构造代码块的大括号必须位于成员 位置上. 16 17 18 代码块的类别: 19 1. 构造代码块. 20 2. 局部代码块. 大括号位于方法之内. 作用:缩短局部 变量 的生命周期,节省一点点内存. 21 3. 静态代码块 static 22 */ 23 24 clas

安卓代码混淆注意事项

安卓代码混淆时经常会出现各种问题,下面罗列一些注意事项 1.依赖的工程中使用的jar包若和工程自身中的jar包一样的话,直接删除依赖工程中相同的jar包即可 2.native方法要阻止混淆 例: # natvie 方法不混淆 -keepclasseswithmembernames class * { native <methods>; } 3.若自定义基类Activity中有根据名称为控件注入值的要采用如下方法阻止字段被混消 如 基类Activity中有如下控件注入方法 protected v

app的支付宝接入代码及注意事项

//支付宝支付 public function alipay($money,$order_sn,$body) { vendor('aop.AopClient'); //官方sdk引入的文件 vendor('aop.request.AlipayTradeAppPayRequest'); //官方sdk引入的文件 $aop = new \AopClient(); $aop->gatewayUrl="https://openapi.alipay.com/gateway.do"; $ao

Android项目外接高德地图代码混淆注意事项

如今好多项目中都加入了第三方jar包,可是最大的问题就是打包的时候代码混淆报错,下面是高德地图混淆报错解决方式: 在proguard-project.txt中加入例如以下代码: -libraryjars   libs/android-support-v4.jar -dontwarn android.support.v4.** -keep class android.support.v4.** { *; } -keep interface android.support.v4.app.** { *

MySQL 代码开发注意事项----开发高性能的sql

序言 一个服务或者一个程序,由 程序+数据组成.在数据这块,计算机中IO是比CPU要慢得多,为了减少IO,减少CPU运算.我们第一时间会想到索引,但索引为啥会提高效率,因为可以减少IO,在查询的时候不用遍历整张表. 关于mysql 的小知识, 1)在创建表的时候如果在业务中能保证非null的字段,建议明确标示not null 因为mysql中对null需要特殊的标示.使用not null 字段更节省空间.对接下来的索引构建也有好处. 2)count(*) 和count(id) id 代表某个字段

【持续更新】把.net代码转换为java代码的注意事项

国内大多数大学的软件相关专业大多强制学生学习c和Java,但.net 的几个语言可以说是选学的. 由于visual studio在windows平台上使用相对方便,一些同学会在上大学的Java课之前自学.net开发技术. 这一类同学就需要一些代码转换技巧来帮助学习Java. 在这之前我吐槽一下TinyMCE编辑器,它不能正确染色一些vb.net的关键字,比如Async, NameOf, Aggregate .c#的某些关键字也不能正确染色,如__arglist. 由于我这学期才开始上Java课,

svn提交或更新代码的注意事项

从左至右依次是: 更新:更新别人的代码 提交:提交自己的代码 更新或提交: 冲突:没有冲突就可以更新或提交代码 提交中,前面带点的不可以提交,work文件夹不可以提交 webroot文件夹不可以提交,因为里面有class文件 原文地址:https://www.cnblogs.com/CrisZjie180228/p/8648763.html