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 对象. ...
随机推荐
- 33.[LeetCode] Search in Rotated Sorted Array
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...
- [转]Zookeeper系列(一)
一.ZooKeeper的背景 1.1 认识ZooKeeper ZooKeeper---译名为“动物园管理员”.动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物,而 ...
- 用 Python 编写的 Python 解释器
Allison是Dropbox的工程师,在那里她维护着世界上最大的由Python客户组成的网络.在Dropbox之前,她是Recurse Center的引导师, … 她在北美的PyCon做过关于Pyt ...
- python序列成员资格
可以用做登录操作,判断用户名密码是否正确! 代码示例: database = [ ['], ['], ['], ['] ] username = input("UserName: " ...
- OOP 1.2 const关键字
1.2 const关键字 1.常量 指针常量 定义常量:const 类型 =值 定义指针常量:const *类型=值 常量指针不可通过常量指针修改其指向的内容 可直接修改其指向的内容 常量指针的指向可 ...
- php addslashes和stripslashes函数
addslashes — 使用反斜线引用字符串 stripslashes — 反引用一个引用字符串 Example #1 一个 addslashes() 例子 <?php$str = &qu ...
- C++ Primer Plus学习:第九章
C++第九章:内存模型与名称空间 C++在内存中存储数据方面提供了多种选择.可直接选择保留在内存中的时间长度(存储持续性)以及程序哪一部分可以访问数据(作用域和链接)等. 单独编译 程序分为三个部分: ...
- scala程序运行的几种方式
HelloWorld简单实例 object HelloWorld{ def main(args:Array[String]){ println("HelloWorld") } } ...
- virtio是啥子
这个山头今天好像要攻占下来了 guest os中的一些特权操作会被hypervhisor给接收,这里一个很重要的认识是:hypervisor是os的os,既然要访问资源,那么就需要经过整机资源的管理者 ...
- java学习 猜数字
package study; import java.util.Scanner; /** * 猜数字小游戏 * * @author carry * */ public class GuessNumbe ...