彻底解密C++宽字符

1、从char到wchar_t “这个问题比你想象中复杂” 从字符到整数 char 是一种整数类型,这句话的含义是,char所能表示的字符在C/C++中都是整数类型。好,接下来,很多文章就会举出一个典型例子,比如,'a'的数值就是0x61。这种说法对吗?如果你细心的读过K&R和BS对于C和C++描述的原著,你就会马上反驳道,0x61只是'a'的ASCII值,并没有任何规定C/C++的char值必须对应ASCII。C/C++甚至没有规定char占几位,只是规定了sizeof(char)等于1。 当然,目前大部分情况下,char是8位的,并且,在ASC...
默认分类 | 2014-02-11 19:21 | 阅读 4172 次 | 评论 0 条

InterlockedIncrement函数详解

InterLockedIncrement and InterLockedDecrement 实现数的原子性加减。什么是原子性的加减呢? 举个例子:如果一个变量 Long value =0; 首先说一下正常情况下的加减操作:value+=1; 1:系统从Value的空间取出值,并动态生成一个空间来存储取出来的值; 2:将取出来的值和1作加法,并且将和放回Value的空间覆盖掉原值。加法结束。 如果此时有两个Thread ,分别记作threadA,threadB。 1:threadA将Value从存储空...
默认分类 | 2014-02-10 00:18 | 阅读 1446 次 | 评论 0 条

内存管理相关的几个函数

一、内存管理基础 win32中的内存管理是分层次的,系统提供了几组层次不同的函数来管理内存,它们是 标准内存管理函数、堆管理函数、虚拟内存管理函数和内存映射文件函数。 windows充分利用了80X86处理器保护模式下的线性寻址机制和分页机制,这些机制是 win32内存管理的基础。 1)虚拟内存管理函数:管理虚拟内存,主要用于保留/提交/释放虚拟内存,在虚拟内存 页上改变保护方式、锁定虚拟内存页,以及查询一个进程的虚拟内存等操作,这是一组位于 底层的函数。 2)堆管理函数:堆的主要功能是有效地管理内存和进程的地址空间。win32中,进程可以 使用的整个地...
默认分类 | 2014-02-09 11:23 | 阅读 2513 次 | 评论 0 条

IP、ICMP、UDP、TCP 校验和算法

以前看计算机网络相关的书,每次看到IP或者UDP报头校验和时,都一瞥而过,以为相当简单,不就是16bit数据的相加吗。最近在研究《TCP/IP详解 卷1:协议》这本书,看到校验和是16bit字的二进制反码和(晕,以前都没注意原来是反码和,看来以前看书不仔细啊!罪过,罪过~~),觉得很奇怪,为什么会用反码和,而不是直接求和呢?(因为我认为TCP/IP协议里面的算法和思想一般都是非常经典的,人家这么做一定有原因的)下面就来探索一下这个校验和算法具体怎么实现的。 首先,IP、ICMP、UDP和TCP报文头部都有校验和字段...
网络编程 | 2014-02-08 23:02 | 阅读 5017 次 | 评论 0 条

MFC中的_T宏

Windows使用两种字符集ANSI和UNICODE, 前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的情况。 而后者是双字节方式,方便处理双字节字符。 Windows NT的所有与字符有关的函数都提供两种方式的版本,而Windows 9x只支持ANSI方式。_T一般同字常数相关,如_T("Hello")。如果你编译一个程序为ANSI方式,_T实际不起任何作用。 而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。 _T()和_L()...
MFC | 2014-02-07 15:24 | 阅读 3441 次 | 评论 0 条

简单工厂模式

计算器的实现: 1)业务逻辑代码 /************************************************ Class: 运算类 Description: 各种运算的父类,提供公共接口 ************************************************/ class COperation { public: double m_nFirst; double m_nSecond; public: virtual double GetResult() { return 0; } ...

netstat命令详解

netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息, 语  法:netstat [-acCeFghilMnNoprstuvVwx][-A网络类型>][--ip] 补充说明:利用netstat指令可让你得知整个Linux系统的网络情况。 参  数: -a或--all 显示所有连线中的Socket。 -A网络类型>或--网络类型> 列出该网络类型连线中的相关地址。 -c或--continuous 持续列出网络状态。 -C或--cache 显示路由器配置的快取信息。 -e或--exten...
默认分类 | 2014-02-06 22:17 | 阅读 2250 次 | 评论 0 条

select模型服务器端和客户端代码

使用VC6.0编译。为了测试方便,服务器端只接收一次数据,当客户端关闭后,服务器端也随之关闭。 服务器端代码: #include "../common/InitSock.h" #include <stdio.h> CInitSock theSock; //加载套接字库 int main() { USHORT nPort = 4567; //此服务器监听的端口号 //创建监听套接字 SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); so...
网络编程 | 2014-02-06 22:11 | 阅读 3680 次 | 评论 0 条

虚函数 原理

虚(virtual)函数的一般实现模型是:每一个类(class)有一个虚表(virtual table),内含该class之中有作用的虚(virtual)函数的地址,然后每个对象有一个vptr,指向虚表(virtual table)的所在。 请允许我援引自深度探索c++对象模型一书上的一个例子: class Point { public: virtual ~Point(); virtual Point&amp; mult( float ) = 0; float x() const {...
C++ | 2014-02-06 13:07 | 阅读 2163 次 | 评论 0 条

C++中public,protected,private访问

第一:private, public, protected 访问标号的访问范围。 private:只能由1.该类中的函数、2.其友元函数访问。 不能被任何其他访问,该类的对象也不能访问。 protected:可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。 但不能被该类的对象访问。 public:可以被1.该类中的函数、2.子类的函数、3.其友元函数访问,也可以由4.该类的对象访问。 注:友元函数包括3种:设为友元...
C++ | 2014-02-05 20:56 | 阅读 2165 次 | 评论 0 条

VC6.0的INTERNAL COMPILER ERROR错误 (转)

今天复习关于运算符重载这一章节,以前学习的时候用的是gcc编译器, 在VC6.0的时候会遇到莫名其妙的问题: --------------------Configuration: integer1 - Win32 Debug-------------------- Compiling... integer.cpp D:\My Documents\我的工程\integer1\integer.cpp(9) : fatal error C1001: INTERNAL COMPILER ERROR (compiler f...
C++ | 2014-02-05 09:37 | 阅读 2881 次 | 评论 0 条

C++代码注释规范(整理)(转)

最近一直在给项目代码加注释,因为结项有一项工程性的要求是注释占到总行数的额50%,这几天可苦了我们几个。前几天为了统一项目组的注释规范,专门整理了一份,以后可能也用得着,放着备份下。 1 源文件头部注释 Ø 列出:版权、作者、编写日期和描述。 Ø 示例: /************************************************* Copyright:bupt Author: Date:2010-08-25 Des...
C++ | 2014-02-04 17:52 | 阅读 1678 次 | 评论 0 条

C/C++内存对齐

一、什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适...
C++ | 2014-02-01 23:11 | 阅读 3154 次 | 评论 2 条

用C++实现网络编程---抓取网络数据包的实现方法(转)

做过网管或协议分析的人一般都熟悉sniffer这个工具,它可以捕捉流经本地网卡的所有数据包。抓取网络数据包进行分析有很多用处,如分析网络是否有网络病毒等异常数据,通信协议的分析(数据链路层协议、IP、UDP、TCP、甚至各种应用层协议),敏感数据的捕捉等。下面我们就来看看在windows下如何实现数据包的捕获。 下面先对网络嗅探器的原理做简单介绍。 嗅探器设计原理 嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字(socket)方式来进行。但是,通常的套接字程序只能响应与...
网络编程 | 2014-02-01 22:24 | 阅读 5398 次 | 评论 0 条

sscanf 用法(转)

sscanf() - 从一个字符串中读进与指定格式相符的数据。 swscanf()- 用于处理宽字符字符串,和sscanf功能相同。 一、函数原型: int sscanf( const char *, const char *, ...); int sscanf(const char *buffer,const char *format,[argument ]...); buffer存储的数据 format格式控制字符串 argument 选择性设定字符串 ...
C++ | 2014-02-01 21:42 | 阅读 5626 次 | 评论 0 条

指向类成员的指针

#include <iostream> using namespace std; class c1 { public: int val; c1(int i) { val = i; } int double_val() { return val + val;} }; int main() { int c1::*data; //data member pointer int (c1::*func)(); //function member pointer c1 ob1(1), ob2(2); //create objects data...
C++ | 2014-02-01 15:56 | 阅读 1247 次 | 评论 0 条

shared_ptr

shared_ptr是一个最像指针的“智能指针”,是boost.smart_ptr库中最有价值、最重要的组成部分,也是最有用的。 shared_ptr实现的是引用计数的智能指针,可以被自由拷贝和赋值,在任意的地方共享它,当没有代码使用(引用计数为0)它时才删除被包装的动态分配的对象。shared_ptr也可以安全地放到标准容器中。 示例1: #include <boost/smart_ptr.hpp> #include <iostream> #include <cassert> using namespace boost...

scoped_ptr和scoped_array

scoped_ptr不允许拷贝、赋值(因为scoped_ptr同时把拷贝构造函数和赋值操作符都声明为私有的,禁止对智能指针的复制操作),只能在scoped_ptr被声明的作用域使用。除了*和->外也没有定义其他的操作符(不能对scoped_ptr进行++或者--等指针算术操作)。 示例如下: #include <boost/smart_ptr.hpp> #include <iostream> #include <string> using namespace boost; using namespace std; int main()...