ACE服务端编程2:ACE跨平台之数据类型和宽字符
ACE网络库的主要优势之一就是跨平台,ACE提供了操作系统API和编译器级别的跨平台解决方法,使开发人员不用再去关心操作系统和编译器的差异,但因此也带来了ACE的复杂性。
ACE网络库的组织结构主要分为四层:OS适配层、wrapper facade层、框架层、服务层,其中OS适配层为操作系统API提供了包装函数,保证了系统级的跨平台特性。
而不同的C++编译器在以下方面也有明显的差异:
1、模版;
2、数据类型和宽字符;
3、运行时初始化和关闭;
4、分配堆内存;
以上主要参考自APG里内容,但APG有些过于陈旧,例如其中提到的ACE_OS为了避免编译器不支持命名空间,使用类来实现,而在ACE的新版本中已改为命名空间实现。
本文主要讨论数据类型和宽字符的ACE跨平台解决方式,基于ACE 6.0版本,ACE的编译方法可以参考之前写的http://www.cnblogs.com/ym123/p/4277256.html:
数据类型
不同的C++编译器的基本数据不同,通常通过预定义类型来解决此,这也是C++常用技巧。
ACE也定义了常用的基本类型:
ACE_INT8、ACE_INT16、ACE_INT32、ACE_INT64和无符号ACE_UINT8、ACE_UINT16、ACE_UINT32、ACE_UINT64;
同时ACE还提供了SIZEOF的定义,可以方便获得该类型在编译器的长度:
ACE_SIZEOF_LONG、ACE_SIZEOF_INT、ACE_SIZEOF_CHAR...
ACE还提供了大尾和小尾的定义:
ACE_BYTE_ORDER,其值是ACE_BIG_ENDIAN或是ACE_LITTLE_ENDIAN;
如果数据类型的尺寸对你的程序很重要,就不应该依赖编译器的硬件尺寸而是使用这些基础类型,例如常见的确定TCP数据包内容长度的头尺寸,就应该明确长度。
这些类型定义在ace/Basic_Types.h头文件中。
窄字符和宽字符
ACE定义了两个常量:
ACE_HAS_WCHAR 用于启用ACE的宽字符配置;
ACE_USES_WCHAR 用于指示ACE在内部使用宽字符配置。
这两个常量在编译ACE网络库时起作用,如果想使用宽字符,编译ACE时在config.h中输入:
#define ACE_HAS_WCHAR
#define ACE_USE_WCHAR
ACE定义了ACE_TCHAR类型,根据ACE_USES_WCHAR使用char或者wchar_t;
ACE_TEXT(str),根据ACE_USES_WCHAR正确定义字符串文本;
ACE_TEXT_CHAR_TO_TCHAR(str),如果需要,把char * 转换为ACE_TCHAR;
ACE_TEXT_WCHAR_TO_TCHAR(str),如果需要,把wchar_t *转换为ACE_TCHAR;
ACE_TEXT_ALWAYS_CHAR(str),如果需要,把ACE_TCHAR转换为char *;
ACE定义了ACE_CString和ACE_WString类型,存取窄字符串和宽字符串,具体用法与std::string类型相似,定义在ace/SString.h头文件中。
ACE解决其他三个编译器差异的实现在后续博文中讲解。
记录,为更好的自己!
ACE服务端编程2:ACE跨平台之数据类型和宽字符的更多相关文章
- ACE服务端编程3:ACE跨平台之分配堆内存
ACE服务端编程系列的第三篇,探究ACE解决不同编译器之间分配堆内存的差异. 在ACE的官方示例中会看到大量的ACE_NEW_RETURN,ACE_NEW这样的宏,这是ACE为了消除不同编译器编译的代 ...
- ACE服务端编程4:ACE跨平台之运行时初始化和关闭
参考APG里的说法:平台差异及不兼容性的一个特别的方面,是对象的运行时初始化和程序关闭时这些对象的相应析构. ACE为了明确管理对象的清理,定义了ACE_Object_Manager类,这个类不仅涉及 ...
- ACE服务端编程1:使用VS2010编译ACE6.0及从ACE5.6升级的注意事项
ACE是一个跨平台的用于并发通信的C++框架,项目开始时使用的是ACE 5.6发布版,目前最新的ACE版本是6.3.0. 网上一直有一种黑ACE的氛围,主要黑点在于ACE的复杂和作者的背景,结合实际应 ...
- ACE服务端编程5:ACE日志输出和跟踪
服务器程序经常需要在命令行中显示错误消息.状态或者用来跟踪程序的执行路径,最简单的方法是使用printf. ACE提供了更强大日志设施: 1.可以在编译时启用或禁用宏: 2.可以动态的启用或禁用宏: ...
- Linux多线程服务端编程一些总结
能接触这本书是因为上一个项目是用c++开发基于Linux的消息服务器,公司没有使用第三方的网络库,卷起袖子就开撸了.个人因为从业经验较短,主 要负责的是业务方面的编码.本着兴趣自己找了这本书.拿到书就 ...
- 《Linux 多线程服务端编程:使用 muduo C++ 网络库》电子版上市
<Linux 多线程服务端编程:使用 muduo C++ 网络库> 电子版已在京东和亚马逊上市销售. 京东购买地址:http://e.jd.com/30149978.html 亚马逊Kin ...
- 《Linux多线程服务端编程:使用muduo C++网络库》上市半年重印两次,总印数达到了9000册
<Linux多线程服务端编程:使用muduo C++网络库>这本书自今年一月上市以来,半年之内已经重印两次(加上首印,一共是三次印刷),总印数达到了9000册,这在技术书里已经算是相当不错 ...
- 《Linux多线程服务端编程》笔记——多线程服务器的适用场合
如果要在一台多核机器上提供一种服务或执行一个任务,可用的模式有 运行一个单线程的进程 运行一个多线程的进程 运行多个单线程的进程 运行多个多线程的进程 这些模式之间的比较已经是老生常谈,简单地总结 模 ...
- 《Linux多线程服务端编程》笔记——线程同步精要
并发编程基本模型 message passing和shared memory. 线程同步的四项原则 尽量最低限度地共享对象,减少需要同步的场合.如果确实需要,优先考虑共享 immutable 对象. ...
随机推荐
- Pyhone学习之环境搭建
一.python 环境搭建 本章节我们将向大家介绍如何在本地搭建Python开发环境.Python可应用于多平台包括 Linux 和 Mac OS X.你可以通过终端窗口输入 "python ...
- dp算法之硬币找零问题
题目:硬币找零 题目介绍:现在有面值1.3.5元三种硬币无限个,问组成n元的硬币的最小数目? 分析:现在假设n=10,画出状态分布图: 硬币编号 硬币面值p 1 1 2 3 3 5 编号i/n总数j ...
- Python 代码调试技巧
使用 pdb 进行调试 pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变 ...
- HTML页面模板代码
作者声明:本博客中所写的文章,都是博主自学过程的笔记,参考了很多的学习资料,学习资料和笔记会注明出处,所有的内容都以交流学习为主.有不正确的地方,欢迎批评指正 HTML页面模板代码 常用的页面模板 & ...
- centos上搭建git服务--2
在 Linux 下搭建 Git 服务器 环境: 服务器 CentOS6.6 + git(version 1.7.1)客户端 Windows10 + git(version 2.8.4.window ...
- [Prism框架实用分享]如何在Prism应用程序中使用日志
前言 在Prism中有关日志的命名空间: Microsoft.Practices.Prism.Logging 在Prism中,你可以使用Prism自带的Logger(比如TextLogger等),也可 ...
- 3dContactPointAnnotationTool开发日志(二七)
今天的主要工作是把选中物体以及复制删除物体和右边三个面板联系起来,就是通过鼠标框选住物体,右边面板的对应项的颜色也会改变,而且通过右边面板也能控制物体的选中状态,被选中的物体成cyan青色,并且包 ...
- Spring Cloud 之 Eureka
Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能,服务 ...
- 第147天:web前端开发中的各种居中总结
一.水平居中 方法① :行内元素 (父元素)text-align,(子元素)inline-block .parent{text-align: center;} .child{display: inli ...
- 第104天:web字体图标使用方法
字体图标经常使用的是 阿里图标库的:http://www.iconfont.cn/ icomoon图标库的:https://icomoon.io/ 一.阿里库字体图标使用 第一步: 首先进入阿里巴巴矢 ...