[转][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等动态代理技术使得程序扩展性很强 为什么说使得程序扩展性很强? ...
随机推荐
- Docker学习笔记之使用 Docker Compose 管理容器
0x00 概述 通过之前的介绍,我们已经基本掌握了构建.运行容器的方法,但这还远远不够,由于 Docker 采用轻量级容器的设计,每个容器一般只运行一个软件,而目前绝大多数应用系统都绝不是一个软件所能 ...
- P3380 【模板】二逼平衡树(树套树)(线段树套平衡树)
P3380 [模板]二逼平衡树(树套树) 前置芝士 P3369 [模板]普通平衡树 线段树套平衡树 这里写的是线段树+splay(不吸氧竟然卡过了) 对线段树的每个节点都维护一颗平衡树 每次把给定区间 ...
- rocketmq安装与基本操作
如果不是因为政治原因,就rocketmq的社区活跃度.版本.特性和文档完善度,我是无论如何也不会使用rocketmq的. rocketmq严格意义上并不支持高可靠性,因为其持久化只支持异步,有另外一个 ...
- win7安装mysql-8.0.13-winx64
这里展示一下,由于需要安装一个版本测试一下数据,其实就是超简单的啦. 下包 注:https://dev.mysql.com/downloads/mysql/ 解压与配置 [mysqld] basedi ...
- webpack --watch和supervisor的不同
webpack --watch只是热打包,也就是前端代码的热加载,要实现后端代码的热加载,也就是热部署,需要使用supervisor 如何使用热部署可以参考这里:http://www.cnblogs ...
- 从输入URL到页面显示发生了什么
阅读目录 1.输入地址 2.浏览器查找域名的 IP 地址 3.浏览器向 web 服务器发送一个 HTTP 请求 4.服务器的永久重定向响应 5.浏览器跟踪重定向地址 6.服务器处理请求 7.服务器返回 ...
- qt无法定位程序输入点 于动态链接库 qt5core.dll
造成步骤:一开始是将现成的dll[Qt5.9.3]放在文件夹里,然后使用Qt5.7.1编译的exe放进去,产生标题错误 原因:dll库不匹配 解决:使用Qt5.7.1自带的cmd命令行,使用winde ...
- 在Ubuntu上更新Chrome到最新的版本
本操作只限于已经安装了Chrome的Ubuntu系统: Step 1: sudo apt-get update Step 2: sudo apt-get install google-chrome-s ...
- Bootstrap3基础 caret 辅助类样式 下拉的小三角
内容 参数 OS Windows 10 x64 browser Firefox 65.0.2 framework Bootstrap 3.3.7 editor ...
- 05文件合并脚本--By Mark Lutz
''' 合并split.py创建的目录下的所有组分文件以重建文件. 依赖文件名的排序:长度必须一致. ''' import os,sys readsize=1024 def join(fromdir, ...