随笔分类 -  C

摘要:29. vc编译器对c函数默认的调用方式是_cdecl方式,函数参数按照从右向左的顺序入栈,被调函数出栈即可顺序使用参数。函数调用者负责清除栈中的参数。此方式支持了c标准中的可变参数函数调用。30. C#的完全基于.net framework (公共语言运行时CLR)的托管代码,其对象内存资源由框架负责管理。使用.net framework托管的代码编译生成中间语言,启动后由框架处理形成机器码,程序的整个声明周期交由框架负责而不是操作系统。这与c++写的非托管代码由操作系统(准确说是c运行时、c++标准库)负责调度是不同的。非托管代码需要手动释放内存资源,而托管是无需也不能干预的。31. .n 阅读全文
posted @ 2011-04-15 16:32 山河 阅读(167) 评论(0) 推荐(0)
摘要:1.概论 运行时库是程序在运行时所需要的库文件,通常运行时库是以LIB或DLL形式提供的。C运行时库诞生于20世纪70年代,当时的程序世界还很单纯,应用程序都是单线程的,多任务或多线程机制在此时还属于新观念。所以这个时期的C运行时库都是单线程的。 随着操作系统多线程技术的发展,最初的C运行时库无法满足程序的需求,出现了严重的问题。C运行时库使用了多个全局变量(例如errno)和静态变量,这可能在多线程程序中引起冲突。假设两个线程都同时设置errno,其结果是后设置的errno会将先前的覆盖,用户得不到正确的错误信息。 因此,Visual C++提供了两种版本的C运行时库。一个版本供单线程应用程 阅读全文
posted @ 2011-04-15 16:29 山河 阅读(282) 评论(0) 推荐(0)
摘要:一、 软件执行流程1、 软件编译流程Ø 预编译完成宏展开工作。Ø 为每一个.cxx源文件编译一个目标文件(.obj,.o),目标文件中至少包含二进制的代码段和数据段。在cxx源文件中可能会引用在其他cxx/hxx中定义的符号,也可能是自己定义的一些符号,这些作用域超过一个cxx文件的符号称为“public符号”(例如非静态函数)。因此每一个目标文件中也包含一个符号表,用于记录自己引用的符号及自己提供的public符号。Ø 编译器合成这些目标文件成一个库文件(.lib),同时解析可以找到的符号引用。此时这个库文件包含了二进制的代码段和数据段,同样也会包含一个符号表, 阅读全文
posted @ 2011-04-15 16:28 山河 阅读(254) 评论(0) 推荐(0)
摘要:1. 所有变量定义位于函数开始处。2. 尽量避免全局变量,全局变量需于实现文件中定义,头文件中extern声明。3.浮点零值比较采用区间值。4.保证正确的前提下尽量使用移位运算。5.If语句、switch语句优先处理出现概率大的情况。6. 指针与NULL比较反写如:NULL==p。7. 循环嵌套时最长的循环放内层短的放外层。8.尽量不在循环体内修改循环变量。9.凡是无返回值、无参数、任意类型指针参数的函数均使用void或void指针。10.适当使用const,使用目的限于节省空间、提高效率、不允许修改或可能产生的函数参数修改。11.对于可变、多变的寄存器变量、多线程共享变量,在经过代码优化处理 阅读全文
posted @ 2011-04-15 16:10 山河 阅读(421) 评论(0) 推荐(0)
摘要:回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数(简单如一按钮的事件相应函数)。回调函数在windows编程使用的场合很多,比如Hook回调函数:MouseProc,GetMsgProc以及EnumWindows,DrawState的回调函数等等,还有很多系统级的回调过程。之所以产生使用回调函数这个想法,用VC写的一个DLL程序进行一些时间比较长的异步工作,工作完成之后,需要通知使用DLL的应用程序:某些事件已经完成,请处理事件的后续部分。开始想过使用同步对象,文件影射,消息等实现DLL函数到应用程序的通知,后来突然想到可不可以在应用程序端先写 阅读全文
posted @ 2011-04-15 16:10 山河 阅读(354) 评论(0) 推荐(1)