c/c++
文章平均质量分 53
必成桂
资深码农一枚
展开
-
如何利用doxygen生成pdf文档
自己工作中写的一个文档。希望能对有需要的人有所帮助。 How to generate pdf file with Doxygen原创 2009-04-22 18:35:00 · 11175 阅读 · 2 评论 -
有关C++析构函数的异常(Exceptions in Destructors)
今天修复了一个系统的bug,原因在于析构函数中抛出了异常,而且该异常未被捕获,从而导致程序的终止。我想很多做c++开发的人都知道,最好不要在析构函数里抛出异常。我查了一下 c++ programming language,书上是这样说的 : 通常情况下,析构函数在一下两种情况下会被调用: 1. 正常调用: 1). 局部变量离开作用范围后,析构函原创 2009-04-22 17:45:00 · 1318 阅读 · 0 评论 -
c++ 的new 数组操作
今天群里一个朋友问到:有class A,1. A* pa = new A[3] 2. pa[0] = A();3. pa[1] = A();4. pa[2] = A(); 5. delete []pa; 构造函数和析构函数是怎么调用的? 在1里,new A[3] 首先会分配内存,然后调用A的默认构造函数来初始化这个数组。所以在这里A的构造函数被调用了原创 2009-07-14 16:57:00 · 29718 阅读 · 0 评论 -
如何防止头文件被重复包含
在windows平台下,有一个很方便的宏: #pragma once指定当前文件在构建时只被包含(或打开)一次,这样就可以减少构建的时间,因为加入#pragma once后,编译器在打开或读取第一个#include 模块后,就不会再打开或读取随后出现的相同#include 模块. 另外,还可以用条件编译语句来实现:#ifndef "XX_H"#define "XX_原创 2009-07-17 11:54:00 · 1167 阅读 · 0 评论 -
c++的名字查找
在C++中,函数编译时检查过程如下:第一步,执行名字查找(namelookup):在调用类中查找,并生成候选列表;若候选列表为空,再扩大查找范围(如名 字空间内,或父类);如此循环。如果最终无结果,那么抱歉,就会提示你“名字未能找到”;否则,编译器跳到第二步。第二步,执行重载辨别(overloadresolution):如果第一步得到的候选者个数大于一,编译器将以原创 2009-07-22 17:30:00 · 794 阅读 · 0 评论 -
什么时候该使用前置声明?
首先,我们为什么要包括头文件?问题的回答很简单,通常是我们需要获得某个类型的定义(definition)。那么接下来的问题就是,在什么情况下我们才需要类型的定义,在什么情况下我们只需要声明就足够了?问题的回答是当我们需要知道这个类型的大小或者需要知道它的函数签名的时候,我们就需要获得它的定义。假设我们有类型A和类型C,在哪些情况下在A需要C的定义:A继承至CA有一个类型为C的成转载 2009-05-15 17:18:00 · 2748 阅读 · 0 评论 -
Boost::array 介绍
本文为大家介绍c++里支持静态数组的容器:boost.array. boost.array很有可能出现在下一代标准库里。 1. 为什么我们需要固定大小的数组的容器 首先,固定大小的数组还是很常见的,虽然stl提供了vector,但是vector作为动态可增长的数组,比静态数组多了一点开销,这在一些人看来是无法忍受的。c++里也需要提供固定大小容量的数组容器,当然,性能可以和普原创 2009-05-15 22:02:00 · 6732 阅读 · 1 评论 -
一个ini文件读写类的设计和实现
前言: 决定自己写一个ini读写类,希望对大家能有所帮助。 如有朋友发现问题,请务必致信bicheng.gui@gmail.com 1. 什么是ini文件? ni 文件是文本文件,中间的数据格式一般为: [Section1 Name] KeyName1=value1 KeyName2=value2 ... [Section2原创 2009-05-15 17:31:00 · 1909 阅读 · 1 评论 -
输入一段文字(英文,带若干种标点符号),计算单词个数
这是一个很常见的笔试题目。给出我的解法: 算法思路: 该算法需要一个bool值,用来防止word被重复计算,flag初始值为假。遍历该字符串,如果字符为字母或数字(组成单词的一部分),如果flag为假,则结果加1,并将flag变成真。如果字符串为分隔符,则把flag设为假。//判断是否为分隔符 bool IsSeperator(char c){ sw原创 2009-05-26 16:10:00 · 6753 阅读 · 0 评论 -
memmove 和 memcpy的区别
memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下: void *memcpy(void *dst, const void *src, size_t count);void *memmove(void *dst, const void *src, size_t count);原创 2009-08-13 16:12:00 · 1191 阅读 · 1 评论 -
VC 如何判断一个文件为目录
自己写的一个函数,判断一个文件是否为目录: /** * check whether a file is a directory @return true if is a directory, else false(if file not exists, false) */__declspec(dllexport) bool IsDirectory(const char* fil原创 2009-06-08 11:51:00 · 4634 阅读 · 0 评论 -
如何将字符串转换为相应的整型
将字符串转换为整型: bool IsDigit(char c){ return (c >= 0)&&(c } bool IsAlpha(char c){ return ((c >= a)&&(c = A)&&(c } bool IsAlphaOrDigit(char c){ return (IsDigit(c) ||原创 2009-06-09 18:15:00 · 1414 阅读 · 0 评论 -
网络字节序转换函数(64位)
在网络编程里,网络字节序是big-endian的,而大部分的PC的系统都是X86处理器系列,X86采用的是little-endian,所以需要将网络数据流转换成本地数据流的话,需要进行字节序的转换。 标准库里提供了hlton()和nthl()两个函数来支持转换。hston(unsigned short), hlton(unsigned long) 将本地字节序转换为网络字节序原创 2009-08-17 11:14:00 · 16853 阅读 · 4 评论 -
什么时候该使用指针和引用
引用是c++引入的新类型,所以c++引用的语义让很多新手颇为头疼。 引用就是一个对象的别名。对于一个变量的引用进行操作,作用效果会直接反映到这个变量上。 引用在声明的时候必须要初始化,否则编译器会提示错误,所以引用一定不为空。 int i = 20; int& j = i; int& k; //错误,必须要初始化 ++j;原创 2009-06-11 12:17:00 · 3675 阅读 · 2 评论 -
c++左值与右值的含义与误区
术语 “L-Values” 和 “R-Values” 是很容易被搞混的,因为它们的历史渊源也是混淆。他们最初起源是编译器的设计者,从字面上来理解就是表达式左边的值和表达式右边的值。它们的含义一直在演化而名字却没变,现在已经“名”不副“实”了。虽然还是称为left-right 和right-value,但是他们的含义已经大大不同了。 C++ 03 标准上是这样写的原创 2009-06-15 18:08:00 · 847 阅读 · 0 评论 -
如何查看各个类型的最大值
问题源于同事的一个问题,VC编译器里如何查看double的最大值? 他在limits.h里没找到。 在limits.h里面,只可以看到整型的最大值,但是看不到浮点数的最大值。浮点数的最大值可以这样得到: #include #include using namespace std; // compile with: /EHsc int main()原创 2009-08-26 22:01:00 · 1939 阅读 · 0 评论 -
STL高效编程(三) - 用empty()来代替size()判断容器是否为空
用empty()来代替检查size()是否为空对于任意容器c,写下if (c.size() == 0)...本质上等价于写下if (c.empty())... 这就是例子。你可能会奇怪为什么一个构造会比另一个好,特别是事实上empty()的典型实现是一个返回size()是否返回0的内联函数。你应该首选empty()的构造,而且理由很简单:对于所有的标准容器,empt原创 2009-08-29 22:32:00 · 6429 阅读 · 0 评论 -
STL高效编程( 五)-尽量使用区间操作函数来代替单元素操作函数。
给定两个vectorv1和v2,使v1的内容和v2的后半部分相同的最简单方法是什么?不要为“当v2有偶数个元素时才有一半”而烦恼。 时间到!如果你的答案是v1.assign(v2.begin() + v2.size() /2, v2.end()); 或者其他很相似的东西,你就完全对了,可以拿金奖。如果你的答案涉及到多于一个函数的调用,但没有使用任何形式的循环,你接近了正确答案原创 2009-08-30 15:59:00 · 1491 阅读 · 2 评论 -
c++异常参数传递和普通函数参数传递的区别。
从语法上看,在函数里声明参数与在catch子句中声明参数是一样的,catch里的参数可以是值类型,引用类型,指针类型。例如:try{ .....}catch(A a){}catch(B& b){}catch(C* c){} 尽管表面是它们是一样的,但是编译器对二者的处理却又很大的不同。调用函数时,程序的控制权最终还会返回到函数的调用原创 2009-09-02 21:50:00 · 1873 阅读 · 1 评论 -
c++ socket编程入门
什么是 socket? 你经常听到人们谈论着 “socket”,或许你还不知道它的确切含义。现在让我告诉你:它是使用 标准Unix 文件描述 符 (file de script _ or) 和其它程序通讯的方式。什么?你也许听到一些Unix高手(hacker)这样说过:“呀,Unix中的一切就 是文件!”那个家伙也许正在说到一个事实:Unix 程序在执行任何形式的 I/O 的时候,程序是在读转载 2009-09-02 23:06:00 · 4160 阅读 · 1 评论 -
c++资源大全
C++ Programmers Cookbook 语言介绍 大全 (转来的文章)http://www.cppblog.com/mzty/archive/2007/08/13/29922.htmlC++随笔分类列表(高级)C++随笔分类列表(高级):C++精华:61条面向对象的设计原则 http://www.cppblog.com/mzty/archive/2005/转载 2009-09-07 16:13:00 · 1679 阅读 · 0 评论 -
windows 句柄
windows句柄,其实是在说这么一个类型: HANDLE,在windows.h里面,是这样定义的:LPVOID,其实就是一个void*。对于很多新手来说,句柄这个概念有点难以理解。 想要真正了解句柄,你必须首先要了解内核对象。不了解内核对象而空谈句柄,没有任何的意义。 windows内核对象是由操作系统内核分配的一块内存(储存着对象的相关信息), 这段内存只能由内核访问和管理原创 2009-09-07 16:59:00 · 1649 阅读 · 0 评论 -
windows异常处理 __try __except
try-except用法 try except是windows 系统独有的异常处理模型,windows的异常处理模式,称为SEH( structured exception handling ), SEH的异常处理模型主要由try-except语句来完成,与标准的try catch相似。与C++异常处理模型使用catch关键字来定义异常处理模块,而SEH是采原创 2009-09-09 18:19:00 · 8513 阅读 · 1 评论 -
typedef
typedef用来定义一个类型的别名。通常我们这样用:typedef unsigned int UINt; typedef的目的是为了简化某些很长的类型名的书写。比如说有一个类型声明很长,写起来太长了,这时你就可以使用typedef来给他取一个别名,更简短一点的。或者,你想给某些类型在特定的上下文里定义一个新的名字,例如STL里面的template { .....原创 2009-09-14 13:15:00 · 850 阅读 · 0 评论 -
WaitForSingleObject函数用法
等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止。这些等待函数中最常用的是WaitForSingleObject: DWORD WaitForSingleObject(HANDLE hObject, DWORD dwMilliseconds);当线程调用该函数时,第一个参数hObject标识一个能够支持被通知/未通知的内核对象。第二个参数dwMilli翻译 2009-09-14 15:01:00 · 5219 阅读 · 2 评论 -
windows API窗口消息分流器
对于熟悉Win API编程的同志们来说,windowsx.h这个头文件应该不会太陌生吧,这次要讲的内容就来自这个windowsx.h头文件。经常能在msdn上查到这样一些函数,明明是个函数,而且模样长得和一般的api函数也一样一样的,可却叫做macro,为什么呢?留意一下函数使用的requirement,你会发现,它的声明正是在windowsx.h这个头文件里。Windowsx.h包含了这样一些内转载 2009-09-14 22:56:00 · 1456 阅读 · 1 评论 -
little endian和big endian
little endian和big endian其实描述的是硬件级别的规范,对于操作系统而言,little endian和big endian其实是透明的。 目前网上很多的文章讲的都很有问题,下面是我截的一张图,讲的比较规范和透彻的: 用一句话来总结,little endian是 数据的低位字节放在地址的低位。高位字节放在地址的高位big endian是数据的原创 2009-09-16 00:47:00 · 856 阅读 · 0 评论 -
c++重载operator new和operator delete
1:C++标准说:An allocation function shall be a class member function or a global function; a program is ill-formed if an allocation function is declared in a namespace scope other than global scope or转载 2009-09-15 10:27:00 · 5571 阅读 · 2 评论 -
c++文件流基本用法(fstream, ifstream, ostream)
前言:c++的文件流处理其实很简单,前提是你能够理解它。文件流本质是利用了一个buffer中间层。有点类似标准输出和标准输入一样。c++ IO的设计保证IO效率,同时又兼顾封装性和易用性。本文将会讲述c++文件流的用法。有错误和疏漏的地方,欢迎批评指证。需要包含的头文件: 名字空间: std也可以试用fstream提供了三个类,用来实现c++对文件的操作。(文件的创建,读写)原创 2009-09-27 10:59:00 · 182088 阅读 · 11 评论 -
VS2010的Lambda表达式
前言:与boost支持lambda不同的是,VS2010提供对lambda的内建支持。 Lambdas在 C++ 0x 中,“lambda表达式”隐式定义并构建不具名函数对象,这些对象就像手写函数对象一样。下面是 lambda “Hello,World”入门级的示例: C:/Temp>type meow.cpp#include #include转载 2009-09-27 16:18:00 · 6898 阅读 · 0 评论 -
effective c++ 关于c++对象的初始化。
C++ 看上去在对象的初始化方面变化无常。例如,如果你这样做,int x;在某些情形下,x 会被初始化(0),但是在其它情形下,也可能没有。如果你这样做,class Point { int x, y;};...Point p;p 的数据成员有时会被初始化(0),但有时没有。如果你从一个不存在未初始化对象的语言来到 C++,请注意这个问题,因为它非常重要。读取一个未初始化的值会引起未定义行为转载 2009-09-21 10:20:00 · 1651 阅读 · 0 评论 -
Effective STL - 警惕c++让人懊恼的解析
假设你有一个int的文件,你想要把那些int拷贝到一个list中。这看起来像是一个合理的方式:ifstream dataFile("ints.dat");list data(istream_iterator(dataFile), // 警告!这完成的并不 istream_iterator()); // 是像你想象的那样这里的想法是传一对istream_iterator翻译 2009-09-19 23:11:00 · 1071 阅读 · 0 评论 -
Unicode入门
如果你编写的程序是针对非英语国家的用户,如中国、日本、东欧和中东地区,那么你一定要熟悉 UNICODE 字符集。尤其是用 Visual C++/MFC 编写针对上述国家和地区的用户的程序时,如果你想让自己的应用程序得到更广泛的用户,那么必须考虑代码 UNICODE 的兼容性,也就是说它既在 ASCII 模式下运行 ,也能在UNICODE 模式下运行。本文将介绍 UNICODE 的一些基本原创 2009-09-22 15:27:00 · 705 阅读 · 0 评论 -
回调函数
我们经常使用回调函数可以使有些应用(如定时器事件回调处理、用回调函数记录某操作进度等)变得非常方便和符合逻辑,使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。 调用机制从汇编时代起已经大量使用:准备一段现成的代码,调用者可以随时跳转至此段代码的起始地址(汇编指令为call),执行完后再返回跳转转载 2009-09-23 12:04:00 · 1094 阅读 · 0 评论 -
多线程基础
当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力。用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义。现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的。因此掌握多线程多任务设计方法对每个程序员都是转载 2009-09-23 12:07:00 · 1040 阅读 · 1 评论 -
关于c++IO的效率
自己写了一段测试程序,比较c++ IO读和c语言的IO读的效率: long tickcount = GetTickCount();//取得系统启动后的时间(miliseconds) int k = 0; cout for (int i = 0; i { FILE* f = fopen("c://temp//test.txt", "rb");原创 2009-09-25 12:08:00 · 2770 阅读 · 0 评论 -
静态连接库和动态链接库的区别
windows下, 库可以通过以下两种方式来发布: static link library和dynamic link library.一般我们称之为静态库和动态库(DLL)。 什么是静态连接库(static link library),什么是动态链接库(dynamic link library) 首先,静态链接库与动态链接库都是共享代码的方式。 如果采用静态链接库原创 2009-10-10 15:31:00 · 4902 阅读 · 0 评论 -
复杂的指针
要理解指针, 尤其是和一些其他类型修饰符放在一起的指针, 看上去很难,其实不然。一个类型声明里会出现很多修饰符,他们就像普通的表达式一样,有优先级和结合性。只要掌握了这些规律,分析一个复杂的指针类型就很容易了。 分析时, 先从变量名开始,然后根据修饰符的优先级结合性,一步一步分析。下面看几个最常用的例子: int p; // 普通的int变量 int *p;原创 2009-10-10 10:19:00 · 1614 阅读 · 0 评论 -
STL容器中元素的具体需求
STL容器对元素使用的是值语义(valuesemantics). 也就是说,容器会储存要添加的元素的副本。并且在需求时返回这些元素的副本。容器还可以利用赋值运算符对元素赋值。以及调用析构函数销毁元素。因此,在编写一个可用于STL容器的类时,必须要求是可拷贝的。(copyable). 如果你倾向于使用引用语义,此时你需要保存元素的指针而不是元素的值。容器复制一个指针的时候,也是简单原创 2009-10-14 11:45:00 · 1062 阅读 · 0 评论 -
如何从vector里删除元素(erase的副作用)
现在用stl的人越来越多, stl确实是套很漂亮的算法和数据结构库. 但是初用stl的人往往会遇上很多问题.从一个容器中删除元素,是很常用的操作,但是也是初学者常会犯错误的地方,上次baosong就发现了删除map和list中元素会犯的错误. vector是stl里很常用的一个容器, 和map,list等容器相比, 从vector中删符合某些条件的元素有更多的麻烦.比如,我们要完成如下的任务转载 2009-10-15 10:20:00 · 7673 阅读 · 2 评论