[转][c++][跨平台]c++跨平台开发小结
转自:https://blog.csdn.net/dj0379/article/details/53577135
linux编程与windows编程的差异之处:
1. 文件与目录的大小写以及路径分隔符的差别
windows下不区分大小写,路径分隔符一般使用"/";linux下区分大小写,路径分隔符使用"/"。
2. itoa()函数在linux下并不存在
所以使用类似sprintf();之类的函数是个不错的替代。(为什么说是类似函数,看下面一条啦)
3. _snprintf()与_vsnprintf()的差别
sprintf()不能检查目标字符串的长度,可能造成众多安全问题,所以都会推荐使用snprintf()。
int _snprintf(
char * buffer,
size_t count ,
const char * format [ ,
argument] . . .
) ;
例如,要把c2字符串write给c1,比较安全的用法:
char c1[ ] ;
c1[ sizeof ( c1) - ] = ;
_snprintf( c1, sizeof ( c1) , "%s" , c2) ;
if ( c1[ sizeof ( c1) - ] ! = )
{
cout < < "warning: string is truncated" ) < < endl ;
c1[ sizeof ( c1) - ] = ;
}
如果在write之前主动检查一下c2的长度再申请c1的空间当然是最好的。
4. 在linux下并不存在std::exception(char*),可以使用logic_error类型代替exception
5. 尽量使用STL与标准C库,并且要按照标准C++语法来写程序
比如这种用法list< type1<T0> >::iterator iter;在windows下的编译器下没有编译错误;但在linux下,就需要在前面增加typename才能顺利编译通过。
6. 在源文件最后多加一个或几行的空行,以免蹦出警告:"no newline at end of file"
7. windows中对ini文件进行操作的所有函数在linux下都没有对应函数
建议自己写一个操作ini文件的类,在STLChina上有一个使用stl制作这种类的原理介绍和一小段代码片段,自己扩充一下。
8. SOCKET对象集要使用fd_set,不要使用FD_SET
9. stricmp()函数,在linux下用strcasecmp()函数替换
10. 在linux下不存在INVALID_SOCKET、INVALID_HANDLE_VALUE、SOCKET_ERROR、MAX_PATH、INFINITE、STILL_ACTIVE等宏定义
11. 参数要求为char*的时候别忘了给传进去的string加一个.c_str()函数
12. linux下不存在目录操作时要包含的direct.h与io.h头文件,而要包含相应的unistd.h与fcntl.h头文件
13. filelength()函数在linux也不存在,可以通过fstat()函数来替代
使用文件与目录操作函数,不要使用类似_access带下划线的函数,取而代之有access函数可以通用。
14. #prgram once预编译指令在linux下并不起作用,请使用以下标准方式来解决头文件多次包含问题 :
# ifndef _XXXXX_H_
# define _XXXXX_H_
# endif
15. hash_map出现在后期版本的stl库,为兼顾hasp与tree map,请可以通过以下宏来解决 :
// process hash_map # if defined( _MSC_VER)
# if _MSC_VER > =
// hasp_map not standard Container # pragma warning( disable: )
# include < hash_map>
// we believe _STLP_STRING included means using STLPORT # elif defined( _STLP_STRING)
# include < hash_map>
# else
# define hash_map map
# endif
# endif
16. 为了区别不同OS,一般可用的几个宏有:WIN32,__linux__,需要使用与OS相关的内容,请一定用开关来写
17. 对于界面操作部分代码,一定要把它与程序逻辑核心代码用宏分开来,这样的代码才好移植,不要交错
18. 不要假定可执行文件一定有如.exe的扩展名
19. 在父类中用typedef定义的类型,在子类并不能直接使用
20. long类型的变量在32位和64位Windows上都是4个字节,而在64位Linux系统上占8字节。
另附:
linux网络编程常用头文件:
sys/types.h:数据类型定义
sys/socket.h:提供socket函数及数据结构
netinet/in.h:定义数据结构sockaddr_in
arpa/inet.h:提供IP地址转换函数
netdb.h:提供设置及获取域名的函数
sys/ioctl.h:提供对I/O控制的函数
sys/poll.h:提供socket等待测试机制的函数
其他在网络程序中常见的头文件
unistd.h:提供通用的文件、目录、程序及进程操作的函数
errno.h:提供错误号errno的定义,用于错误处理
fcntl.h:提供对文件控制的函数
time.h:提供有关时间的函数
crypt.h:提供使用DES加密算法的加密函数
pwd.h:提供对/etc/passwd文件访问的函数
shadow.h:提供对/etc/shadow文件访问的函数
pthread.h:提供多线程操作的函数
signal.h:提供对信号操作的函数
sys/wait.h、sys/ipc.h、sys/shm.h:提供进程等待、进程间通讯(IPC)及共享内存的函数
在编写网络程序时,可以直接使用下面这段头文件代码
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <fcntl.h>
涉及到用户权限及密码验证问题时加入如下语句:
#include <shadow.h>
#include <crypt.h>
#include <pwd.h>
需要注意的是,应该在编译时链接加密算法库,即增加编译选项:
-lcrypt
涉及到文件及时间操作加入如下语句:
#include <sys/time.h>
#include <utime.h>
#include <time.h>
#include <sys/stat.h>
#include <sys/file.h>
涉及到多进程操作时加入如下语句:
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <signal.h>
涉及到多线程操作时加入如下语句:
#include <pthread.h>
#include <sys/poll.h>
需要注意的是,应该在编译时链接线程库,即增加编译选项:-lthread
[转][c++][跨平台]c++跨平台开发小结的更多相关文章
- [ionic开源项目教程] - 手把手教你使用移动跨平台开发框架Ionic开发一个新闻阅读APP
前言 这是一个系列文章,从环境搭建开始讲解,包括网络数据请求,将持续更新到项目完结.实战开发中遇到的各种问题的解决方案,也都将毫无保留的分享给大家. 关注订阅号:TongeBlog ,查看移动端跨平台 ...
- 移动跨平台开发框架Ionic开发一个新闻阅读APP
移动跨平台开发框架Ionic开发一个新闻阅读APP 前言 这是一个系列文章,从环境搭建开始讲解,包括网络数据请求,将持续更新到项目完结.实战开发中遇到的各种问题的解决方案,也都将毫无保留的分享给大家. ...
- Unity3D ——强大的跨平台3D游戏开发工具(六)
第十一章 制作炮台的旋转 大家知道,炮台需要向四周不同的角度发射炮弹,这就需要我们将炮台设置成为会旋转的物体,接下来我们就一起制作一个会旋转的炮台. 第一步:给炮台的炮筒添加旋转函数. 给炮台的炮筒部 ...
- 使用Xamarin实现跨平台移动应用开发(转载)
刚在朋友圈看到张善友,转发的一条分享“使用Xamarin实现跨平台移动应用开发”,写的确实很详细得体,从收费到开源,这段时间xamarin受到不少质疑,如此文http://blog.csdn.net/ ...
- Vagrant - 打造跨平台的一致开发环境
官网 参考资料 借助 Vagrant ,可以使用 Vagrantfile 文件自动化虚拟机的安装和配置流程,方便快速的打造跨平台的统一开发环境. 1. Vagrant 是啥 Vagrant 用于构建及 ...
- vue开发小结(下)
前言 继前几天总结了vue开发小结(上)后,发现还有很多的点没有能列举出来,于是还是打算新建一个下篇,再补充一些vue开发中需要注意的细节,确实还是都是细节的问题,我只是在这里强调下,希望对大家有帮助 ...
- pdfjs viewer 开发小结
此文已由作者吴家联授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1. pdfjs库简介 PDF.js 是由Mozilla 主导推出的可以将PDF文件转换为H5页面进行展示的 ...
- Android 即时通讯开发小结(二)
<Android 即时通讯开发小结>基于IM Andriod 开发的各种常见问题,结合网易云信即时通讯技术的实践,对IM 开发做一个全面的总结. 相关推荐阅读:. Android 即时通讯 ...
- Android 即时通讯开发小结(一)
<Android 即时通讯开发小结>基于IM Andriod 开发的各种常见问题,结合网易云信即时通讯技术的实践,对IM 开发做一个全面的总结. 相关推荐阅读:. Android 即时通讯 ...
- 5Spring动态代理开发小结
5Spring动态代理开发小结 1.为什么要有动态代理? 好处 1.利于程序维护 2.利于原始类功能的增强 3.得益于JDK或者CGlib等动态代理技术使得程序扩展性很强 为什么说使得程序扩展性很强? ...
随机推荐
- Struts2 的 配置
三.Struts2配置 Struts2的核心配置文件 1.名称和位置是固定的 在src下struts.xml 2.Struts根标签 Package Action Result Action Pa ...
- spring中的springSecurity安全框架的环境搭建
首先在web.xml文件中配置监听器和过滤器 <!--监听器 加载安全框架的核心配置文件到spring容器中--> <context-param> <param-name ...
- Mysql报错java.sql.SQLException:null,message from server:"Host '27,45,38,132' is not allowed to connect
Mysql报错java.sql.SQLException:null,message from server:"Host '27,45,38,132' is not allowed to co ...
- Eclipse中手动清理项目缓存,
用过Eclipse或MyEclipse的小伙伴肯定遇到过这种情况: 代码出错后,在前台访问出问题.然后把代码改好,已经检查不到错误,可是项目在前台访问还是有问题. 这个时候,可能就是Eclipse/M ...
- CentOS 7 install slurm cluster
//slurm install //CentOS 7 system //192.168.159.141 node01 //192.168.159.142 node02 systemctl stop f ...
- JUnit Parametrized Tests
Junit allows us to create parametrized tests. Parametrized test class has to be annotated with the @ ...
- Junit的异常测试
方式1: @Test(expected = IndexOutOfBoundsException.class) public void empty() { new ArrayList<Object ...
- upc组队赛1 闪闪发光 【优先队列】
闪闪发光 题目描述 一所位于云南昆明的中医药本科院校--云南中医学院. 因为报考某专业的人数骤减,正面临着停招的危机. 其中有九名少女想到一条妙计--成为偶像, 只要她们成为偶像,学校的名气便会增加, ...
- 如何安装整个linux系统中所需要的mp3播放库插件? 可以在安装rpmfusion仓库后直接通过dnf install进行按照就可以了
在vi的界面中, 前面的数字, 表示一行. 而对于中文而言, 并不一定是"一个文本行"就是一行, 而是以 回车(硬回车)为标志, 来判定一行的. 而dd, yy等也是以" ...
- Almost Union-Find (并查集+删除元素)题解
思路: 当时只有暴力的思想,1.3都很好达到,只要加一个sum[ ]和num[ ]就可以,但是2比较麻烦,不知道谁以p为根,就想直接扫描然后一个个和p脱离关系,果然超时emmm.通常的想法是我们先用一 ...