
C与C++
文章平均质量分 85
C语言和C++语言开发设计
danforn
纳言敏行,随遇而安
展开
-
正确使用#include和前置声明(forward declaration)
<br />当我往工程里加一个类,而且那个类又与工程里的类相关,如有那个类型的成员变量。情况如下//////A.h///////////class A{.......};////////B.h//////////class B:A{....A member;}结果,编译就会出错,说找不到类形A。解决的办法是在B.h里#include “A.h”。但是有时候不用#include “A.h”,只要在classB:A前加class A;就可以了。更严重的是不但要#include “A.h”,还要class A;。转载 2011-01-04 11:00:00 · 1963 阅读 · 2 评论 -
C++头文件和类实例的大小之间的关系
在C++中为类编写头文件的时候,总要#include一大堆头文件。其实其中的大部分都是不需要的。 C++编辑器需要做的事情其实很简单1:扫描符号2:确定对象的大小。 为了确定这两件事情并不一定需要#include你用到的其他类的头文件。而只需要一个类型申明而已. 1.使用到类型的引用。首先我们知道对象的引用不是对象本身而是类似指针一样的东西。所以任何类型的对象的引用所占有的原创 2008-08-22 14:25:00 · 1243 阅读 · 0 评论 -
C&C++头文件说明
C、传统 C++#include //设定插入点#include //字符处理#include //定义错误码#include //浮点数处理#include //文件输入/输出#include //参数化输入/输出#include //数据流输入/输出#include //定义各种数据类型最值常量#include原创 2008-08-22 14:35:00 · 1022 阅读 · 0 评论 -
Windows 的抢先式多任务中的多线程编程
在32位的Windows系统中,采用的是抢先式多任务,这意味着程序对CPU的占用时间是由系统决定的。系统为每个程序分配一定的CPU时间,当程序的运行超过规定时间后,系统就会中断该程序并把CPU控制权转交给别的程序。与协同式多任务不同,这种中断是汇编语言级的。程序不必调用象PeekMessage这样的函数来放弃对CPU的控制权,就可以进行费时的工作,而且不会导致系统的挂起。 例如,在Windo原创 2008-05-20 13:31:00 · 2535 阅读 · 0 评论 -
进程和线程有什么区别
说法一:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程;同原创 2008-05-21 09:26:00 · 15893 阅读 · 11 评论 -
Windows 2000下的Raw Socket编程
Windows2000在TCP/IP协议组件上做了很多改进,功能也有增强。比如在协议栈上的调整,增大了默认窗口大小,以及高延迟链接新算法。同时在安全性上,可应用IPSec加强安全性,比NT下有不少的改进。 Microsoft TCP/IP 组件包含“核心协议”、“服务”及两者之间的“接口”。传输驱动程序接口 (TDI) 与网络设备接口规范 (NDIS) 是公用的。 此外,还有许多用户模型应用程序的转载 2008-05-14 20:34:00 · 1401 阅读 · 0 评论 -
如何通过socket实现网络通信
为了方便网络编程,90 年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即Windows Sockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议 无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。Socket实际在计算机中提供了转载 2008-05-14 20:25:00 · 2063 阅读 · 2 评论 -
类的嵌套定义问题
A.h文件class A{public:void methodA();...}; B.h文件class B{public:void methodB();...}现在是再类A中要调用类B中的方法,类B中有要调用类A中的方法!试验过的失败方法:方法1:A.h文件#include "B.h"class B;class A{p转载 2008-05-14 09:42:00 · 1672 阅读 · 0 评论 -
VC6.0编译错误解决方法集锦
linking... server.obj : error lnk2001: unresolved external symbol __imp__send@16 server.obj : error lnk2001: unresolved external symbol __imp__wsagetlasterror@0原创 2008-05-15 08:52:00 · 6259 阅读 · 0 评论 -
C++中Static作用和使用方法
1、什么是static? static 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性。 2、为什么要引入static? 函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定原创 2008-04-21 17:30:00 · 54507 阅读 · 12 评论 -
C++访问限制:private public protect经典诠释
public 意味着在其后声明的所有成员对所有的人都可以取。 private 意味着除了该类型的创建者和类的内部成员函数之外,任何人都不能存取这些成员。 protect 它与private基本相似,只有一点不同:继承的结构可以访问protected成员,但不能访问private成员。============================================= pub原创 2008-04-16 09:09:00 · 5159 阅读 · 2 评论 -
VC常用数据类型使用转换详解
CString ,BSTR ,LPCTSTR之间关系和区别CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针。CString 是一个完全独立的类,动态的TCHAR数组,封装了 + 等操作符和字符串操作方法。typedef OLECHAR FAR* BSTR;typedef const char * LPCT原创 2008-05-31 16:33:00 · 1044 阅读 · 0 评论 -
GNU C 的 __attribute__ 机制
GNU C的__attribute__ 可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。__attribute__ 后面紧跟一对括号,里面是相应的__attribute__参数。__attribute__ 语法格式为:__attribute__ ((attribute-list))位置原创 2008-09-02 17:21:00 · 927 阅读 · 0 评论 -
auto_ptr作用和用法
标准auto_ptr智能指针机制很多人都知道,但很少使用它。这真是个遗憾,因为auto_ptr优雅地解决了C++设计和编码中常见的问题,正确地使用它可以生成健壮的代码。本文阐述了如何正确运用auto_ptr来让你的代码更加安全——以及如何避免对auto_ptr危险但常见的误用,这些误用会引发间断性发作、难以诊断的bug。1.为什么称它为“自动”指针? auto_ptr只是众多可能的智能原创 2008-10-28 20:11:00 · 1004 阅读 · 0 评论 -
调用约定(Calling convention)
调用约定(Calling convention)决定以下内容:函数参数的压栈顺序,由调用者还是被调用者把参数弹出栈,以及产生函数修饰名的方法。MFC支持以下调用约定:_cdecl 按从右至左的顺序压参数入栈,由调用者把参数弹出栈。(实现可变参数的函数只能使用该调用约定),对于“C”函数或者变量,修饰名是在函数名前加下划线。对于“C++”函数,有所不同。如函数void test(void)的修饰名是原创 2008-10-20 14:45:00 · 1258 阅读 · 0 评论 -
程序设计警示录
欺骗编译器的人,最终将自食其果。 --Henry Spencer避免使用reinterpret_cast强制转换原创 2008-10-16 10:36:00 · 838 阅读 · 0 评论 -
调用约定概述
在C语言中,调用函数很常见。但是,当高级语言被编译成机器码时,有个问题就凸现出来:在CPU中,电脑没有办法知道一个函数调用需要多少个、什么样的参数,也没有硬件能够保存这些参数。也就是说,电脑不知道怎么给这个函数传递参数,传递参数的工作必须由函数调用者和函数本身来协调。为此,电脑提供了一种被称为栈的数据结构来支持参数传递。栈是一种先进后出的数据结构,栈有一个存储区、一个栈顶指针。栈顶指针原创 2008-09-24 10:10:00 · 757 阅读 · 0 评论 -
标准C++库带的模板函数
absaccumulate, copy and vector::push_backadjacent_difference and vector::push_backadjacent_findadjacent_find (predicate version)advanceBasic Math Functionsbasic_string::appendbasic_str原创 2008-09-23 13:56:00 · 989 阅读 · 0 评论 -
C++类模板的特化
// general versiontemplateclass T>class Compare{public: static bool IsEqual(const T& lh, const T& rh) { return lh == rh; }};这是一个用于比较的类模板,里面可以有多种用于比较的函数, 以IsEqual为例。 一、特化为绝对类型也就是说原创 2008-09-24 18:02:00 · 2073 阅读 · 0 评论 -
强制类型转换函数使用说明
标准c++中主要有四种强制转换类型运算符: const_cast,reinterpret_cast,static_cast,dynamic_cast等等。 1)static_cast(a) 将地址a转换成类型T,T和a必须是指针、引用、算术类型原创 2008-07-03 20:31:00 · 2392 阅读 · 0 评论 -
常用模板及迭代器的使用方法
vector定义:vector m_vctExpA;容器迭代器定义:a 不改变迭代器时:vector::const_iterator iter = m_vctExpA.begin(); vector::const_iterator iterend = m_vctExpA.end();b 改变迭代器时:vector::iterator iter = m_vctExpA原创 2008-07-02 11:01:00 · 1211 阅读 · 0 评论 -
auto_ptr作用和用法
标准auto_ptr智能指针机制很多人都知道,但很少使用它。这真是个遗憾,因为auto_ptr优雅地解决了C++设计和编码中常见的问题,正确地使用它可以生成健壮的代码。本文阐述了如何正确运用auto_ptr来让你的代码更加安全——以及如何避免对auto_ptr危险但常见的误用,这些误用会引发间断性发作、难以诊断的bug。1.为什么称它为“自动”指针? auto_ptr只是众多可能的智能指针之一原创 2008-06-30 15:08:00 · 5969 阅读 · 2 评论 -
双指针的作用和用法
双指针多用于指针交换,可以避免数据复制,提升系统的性能,同时还可以让函数修改指针,例如扩充其大小,指向等一般指针的指针用作参数,大多用在需要函数改变指针(重新引用变量)而又不能通过返回值传递(例如返回值用于传递其他结果)时。为了能完全解决动态内存传递的问题,先回顾一下内存管理的知识要点. (1)内存分配方式有三种: ●从静态存储区域分配。内存在程式编译的时候就已分配好,这块内存在程原创 2008-06-25 11:07:00 · 5462 阅读 · 0 评论 -
深入浅出VA函数的使用技巧
VA函数(variable argument function),参数个数可变函数,又称可变参数函数。C/C++编程中,系统提供给编程人员的va函数很少。*printf()/*scanf()系列函数,用于输入输出时格式化字符串;exec*()系列函数,用于在程序中执行外部文件(main(int argc,char*argv[]算不算呢,与其说main()也是一个可变参数函数,倒不如说它是exec*转载 2008-04-15 21:09:00 · 1259 阅读 · 0 评论 -
使用STL中map的[]操作符方法
一个map就是一个(关键码(key),值(value))对偶的序列,它提供基于关键码的快速提取操作。也就是说,可以用下标运算符[]将关键码作为下标去执行查找,并返回对应的值。因此可以把map的使用方法想象成有特殊下标的数组。在很多时候用下标运算符[]来对map中的元素进行存取是非常方便和简单的;但是,如果map下标运算符[]运用不得当,也会造成意想不到的问题。 我们知道,C++是不检查下标越原创 2008-04-17 10:33:00 · 1715 阅读 · 1 评论 -
深入理解C语言指针的奥秘
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。 先声明几个指针放着做例子: 例一: (1)int*ptr; (2)char*ptr; (3)int**ptr; (4)in原创 2008-01-09 10:09:00 · 921 阅读 · 0 评论 -
经典编程之字符串篇
标准strcpy函数功能:复制字符串参数:目的字符串指针,源字符串指针(输入参数)返回:目的字符串指针char * strcpy( char *strDest, const char *strSrc ) //将源字符串加const,表明其为输入参数{ assert( (strDest != NULL) && (strSrc != NULL) ); //对源地址和目的地址加非0断言原创 2007-08-30 17:37:00 · 1022 阅读 · 0 评论 -
volatile的意义及用法
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。下面是volatile变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) 3). 多线程应用中被几个任务共享的变量 一般用在多线程程序中,以避免在其原创 2007-08-28 15:41:00 · 1461 阅读 · 0 评论 -
神乎其技,惟C程序,功到自成,十大建议!
1、汝应频繁催动lint工具,据其语法声明修习内力,此事皆因lint之思虑决断实远在君上。 2、不可依随NULL指针,如若不然,混沌痴颠必俟君于彼岸。 3、纵有天赋大智慧,知晓其事无碍,汝亦当尽数强制挪移函数参数为原型所期之数据类型,以免一时疏忽,致使数据类型向汝讨还血债。 4、若头文件未于函数原型之中声明返回值类型,汝当亲为此事,更须谨慎再三,以防不测降临汝身。 5、原创 2007-08-01 10:45:00 · 1579 阅读 · 1 评论 -
如何编写异常安全的C++代码
关于C++中异常的争论何其多也,但往往是一些不合事实的误解。异常曾经是一个难以用好的语言特性,幸运的是,随着C++社区经验的积累,今天我们已经有足够的知识轻松编写异常安全的代码了,而且编写异常安全的代码一般也不会对性能造成影响。 使用异常还是返回错误码?这是个争论不休的话题。大家一定听说过这样的说法:只有在真正异常的时候,才使用异常。那什么是“真正异常的时候”?在回答这个问题以转载 2007-08-01 11:32:00 · 810 阅读 · 0 评论 -
C语言中可变参数的原理和应用
我们在C语言编程中会遇到一些参数个数可变的函数,例如printf()这个函数,它的定义是这样的: int printf( const char* format, ...); 它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的,例如我们可以有以下不同的调用方法: printf("%d",i); printf("%s",s); printf("the number is %d ,s原创 2007-08-01 11:25:00 · 1143 阅读 · 0 评论 -
C++各大名库宝典
在C++中,库的地位是非常高的。C++之父 Bjarne Stroustrup先生多次表示了设计库来扩充功能要好过设计更多的语法的言论。现实中,C++的库门类繁多,解决的问题也是极其广泛,库从轻量级到重量级的都有。不少都是让人眼界大开,亦或是望而生叹的思维杰作。由于库的数量非常庞大,而且限于笔者水平,其中很多并不了解。所以文中所提的一些库都是比较著名的大型库。标准库标准转载 2007-01-17 16:47:00 · 1509 阅读 · 0 评论 -
堆栈和内存的关系
五大内存分区 在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,转载 2006-11-21 14:23:00 · 1943 阅读 · 0 评论 -
回调函数
一回调函数我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理、用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其它函数(比如钩子函数)有何不同呢?使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调原创 2006-11-13 14:36:00 · 972 阅读 · 0 评论 -
数组,函数与指针
一 :关于指针和堆的内存分配 先来介绍一下指针 : 指针一种类型,理论上来说它包含其他变量的地址,因此有的书上也叫它:地址变量。既然指针是一个类型,是类型就有大小,在达内的服务器上或者普通的PC机上,都是4个字节大小,里边只是存储了一个变量的地址而已。不管什么类型的指针,char * ,int * ,int (*) ,string * ,float * ,都是说明了本指针所指向的地址空间是什么类型转载 2006-11-13 18:10:00 · 1014 阅读 · 0 评论 -
Windows下多线程编程技术及其实现
本文首先讨论16位Windows下不具备的线程的概念,然后着重讲述在32位Windows 95环境下多线程的编程技术,最后给出利用该技术的一个实例,即基于Windows95下TCP/IP的可视电话的实现。 一、问题的提出 作者最近在开发基于Internet网上的可视电话过程中,碰到了这样一个问题。在基于Internet网上的可视电话系统中,同时要进行语音采集、语音编解码、图象采集、图转载 2006-11-08 17:47:00 · 1039 阅读 · 0 评论 -
const,mutable,volatile意义与用法
const能够增加程序的健壮型,减少程序出错.const用法很多意义也不同。基本的用法:const int a =200; a的内容不变,a只能是200 ,也就是声明一个int类型的常量(#define a 200)int const s =200; //和上面作用一样 const指针和引用一般用在函数的参数中int* m = &a; //出错,常量只能用常指针int c= 1;con原创 2007-09-06 12:37:00 · 1606 阅读 · 0 评论 -
经典编程之内存篇
标准memset函数功能:设置内存参数:起始指针,设置数据,内存块长度typedef unsigned int U32;typedef unsigned short U16;typedef unsigned char U8;void memset(void* target, U8 data, U32 size){ U8* pMem = (U8*) target; //原创 2007-09-10 15:48:00 · 946 阅读 · 0 评论 -
C语言运算符优先级顺口溜
原创 2007-12-29 15:23:00 · 1336 阅读 · 0 评论 -
如何在C和C++中实现回调
1 回调函数介绍函数指针提供了回调函数的概念。现在我们试着用一个排序函数qsort来理解回调。这个函数根据用户指定的排序法则来对需要排序的field进行排序。需要排序的field可能是任何类型的;它通过一个void 类型的指针传递给qsort 进行排序。当然需排序的field的数量和每个field的size也必须被传递。现在问题是:既然需要排序的field的任何类型信息都没有被传递,那么qs原创 2008-02-03 17:28:00 · 1237 阅读 · 2 评论