c++中的一些容易混淆的研究
(1)、TRUE/FALSE与ture/false以及NULL与null的区别是什么?
1、首先我们要了解true/false是标准c++中定义的关键字,在c语言中是没有bool类型的。
所以为了弥补C与C++中环境的差异,使代码方便移植(主要是为了c++编写的代码移植到C环境中),故在标准C++中定义了TRUE/FALSE宏。定义如下:
#define TRUE 1
#define FALSE 0
故TRUE/FALSE是宏(类型为int类型),而ture/false是标准c++的bool类型关键字。
2、NULL与null的区别看以下定义即可明白。
#ifndef NULL
#ifdef __cplusplus // c++平台
#define NULL 0
#else
#define NULL ((void *) 0) // 需要强制类型转换
#endif
#endif
故在工作中我们尽量用TRUE/FALSE来表示true/false,用NULL来表示null。
(2)_T("XXXX")与L"XXX"的区别
一般如果接触过c++的unicode方面的工作,会比较明白它们的区别,其实我们来看下 tchar.h文件中对 _T 这个宏的定义就会明白,大概就是:
#define _T(x) __T(x)
#ifdef _UNICODE
#define __T(x) L ## x
#else
#define __T(x) x
#endif
其实就是_T("XXX")是与平台相关的,如果你选择是unicode的编码环境,则表示为UTF-16的字符串,否则是ANSI的字符串格式。
而L"XXX"表示了它就是UTF-16字符串,与是否是unicode平台是无关的。所以根据具体情况选择合适的表示方式很重要。
(3)long类型在64位中到底是4个字节还是8个字节?
linux64 windows64 linux32 windows32
char 8 8 8 8
short 16 16 16 16
int 32 32 32 32
long 32 32
long long 64 64 64 64
size_t 64 64 32 32
void* 64 64 32 32
通过上面的表格内容,我们会发现
1、long类型64位的字节数是和操作系统平台相关的,win中是4个字节,linux中是8个字节
2、size_t的字节数是和平台的位深相关的,32位是4个字节,64位时8个字节。具体可以看size_t这个宏的定义即可明白。
3、指针的字节数也和平台的位深相关。
(4) 多线程中不断的申请Socket的套接字,不断的使用,会使用完,怎么办?
struct linger linger = {1, 0};
if(-1 == setsockopt( nSocketAccept, SOL_SOCKET, SO_LINGER, &linger, sizeof(linger) ))
{
perror("SO_LINGER 1 Error");
continue;
}
对套接字加上如上语句即可,表示调用此方法closesocket(nSocketAccept)关闭套接字后是立即回收此套接字,不会等待系统时间的释放。
(5) unicode下c++格式化%S与%s的区别
如wprintf()与vswprintf()这些格式化方法中%S与%s是存在系统平台的差异的!
1、windows
使用%s时,printf是认为输入的字符串是单字符,而wprintf则认为是宽字符的
使用%S时,printf是认为输入的字符串为宽字符,而wprintf则认为是单字符的,正好与%s小写的s相反。
例如: wprintf(L"%S", "abcd") 输出为abcd。 wprintf(L"%S", L"abcd") 输出是a
(因为%S格式的wprintf认为输入的字节是单字节,所以把L"abcd"作为单字节的输入了,而本身真实输入的是宽字节的L"abcd",故输出就是a了)。
2、Linux
使用%s时,则printf与wprintf都认为输入的字符串是单字节的。
使用%S时,则printf与wprintf都认为输入的字符串是宽字节的。
例如: wprintf(L"%S", L"abcd") 与 printf(L"%S", L"abcd")都是输出的为abcd。
好了,是不是觉得linux更对一些呢?天知道,又没有一个标准。
(6) wchar_t的占几个字节?
wchar_t的字节大小是与平台相关的。
Windows下是个字节(UTF-16)
Linux下是个字节(UTF-32)
但是Linux可以在使用 gcc 编译程序的时候再后面跟上 -fshort-wchar 来表示wchar_t是UTF-16编码。
(7)未完待续。。。。
c++中的一些容易混淆的研究的更多相关文章
- php中include文件变量作用域的研究
原文:php中include文件变量作用域的研究 在php中我们有时候需要include一个文件.比如我前段时间在写一个框架的时候,打算用原生的php作为模板,然后写一个display方法引入模板文件 ...
- html中radio、checkbox选中状态研究(静下心来看,静下心来总结)
html中radio.checkbox选中状态研究(静下心来看,静下心来总结) 一.总结 1.单选框的如果有多个checked 会以最后一个为准 2.js动态添加checked属性:不行:通过 $(& ...
- WebGIS中矢量切图的初步研究
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 在GIS领域,金字塔技术一直是一个基础性技术,WMTS规范专 ...
- 关于 Delphi 中的Sender和易混淆的概念(转)
/////////////////////////////////////////////////////// Delphi 中Sender对象的定义///////////////////////// ...
- 【Chromium中文文档】Web安全研究
转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Extension_Sec ...
- maven中添加proguard来混淆代码
只要下回插件并添加相应的配置文件即可.本文仅是做下相关记录 1.修改pom.xml添加插件 <plugin> <groupId>com.pyx4me</groupId&g ...
- 微软BI 之SSIS 系列 - 对于平面文件中 NULL 值处理过程中容易极易混淆的几个细节
开篇介绍 最近有人问我有关文件处理中空值处理的相关问题: OLE DB Destination 中的 Keep Nulls 如何控制 NULL 值的显示? 为什么选中了 Keep Nulls 但是数据 ...
- Java中关于HashMap源码的研究
1.基础知识 1.数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1):数组的特点是:寻址容易,插入和删除困难. 2.链表 链表存储区间离散,占用内存比 ...
- html中radio、checkbox选中状态研究
我们在web页面开发中经常需要让单选框.复选框进行选中或者不选中的操作, 我们可以在元素中添加checked属性 或者添加checked="checked" 都可以让某个选项默认选 ...
随机推荐
- centos 忘记密码
装了个 centos 6.8 安装的时候 要输入 新用户和密码 用 新的用户密码 进去后 各种没权限 重新修改 root 密码 一切OK 步骤 1.重新启动Centos,在启动过程中,长按“ ...
- zookeeper 应用
一,启动一个zk客户端 zookeeper/bin/zkCli.sh ls / 查看根目录下所有节点 create /znode data 创建节点znode,并添加数据内容为data ls /z ...
- log4j输出日志到文件
输出端Appender Appender用来指定日志信息输出到哪个地方,可以同时指定多个输出目的地.Log4j允许将信息输出到许多不同的输出设备中,一个log信息输出目的地就叫做一个Appender. ...
- 声明变量,一定要用 var!
public static T TryGet<T>(Func<T> func, T ifError = default(T)) { try { return func(); } ...
- PLL输出怎么不能配置成我想要的时钟
如下图,我的clk_out7想配置成160M,十几输出变为了150M
- blade and soul factions
Faction You will be asked to join one of the elite Factions as a rising Martial Artist no matter wha ...
- 控件包含代码块(即 <% ... %>),因此无法修改控件集合
错误: “/”应用程序中的服务器错误. 控件包含代码块(即 <% ... %>),因此无法修改控件集合. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解 ...
- vs启动调试很慢的解决办法
1.关闭所有 Visual Studio 2010 实例. 2.单击“开始”,选择“运行...”. 3.键入“devenv.exe /resetuserdata”. 此命令会运行几分钟时间,与此同时, ...
- windows C input 注意
windows控制台输入,默认是以文本模式打开,即使重定向输入,文本模式不变,所以输入时无法读到cr,因为windows已经把crlf转换成单个lf. 如果freopen("CON" ...
- 有关利用python获取网页, 以及KDD近几年论文标题与摘要链接
最近一直在看KDD的论文,不过,由于老师并没有什么合理的方向性,所以考虑把kdd中的大部分内容都利用python将所有标题.摘要获取下来. 还有一个原因在于,看acm上的摘要,都只显示了两行,再看多点 ...