Tips: VC++篇

tipVS2005 没有找到MSVCR80D.dll的完美解决方案

方法1. “工程属性->配置属性->清单工具->常规->FAT32解决办法”,选“是”;
方法2. 找到工程Debug目录下的.rec文件,删掉(或删掉整个Debug目录)重新编译;
方法3. http://www.cnblogs.com/qianinsun/archive/2006/12/01/579182.html

tip字节对齐
#program pack(x) //x=1,2,4,8,16...默认为8
每当一个结构的成员变量要定位时,取该成员变量的长度与x中间的最小值作为标准,该成员变量的偏移量(offset)必须能够被该值整除。当所有的成员都定位完成后,再次取该结构体中最宽成员的长度与x中间的最小值作为标准,整个结构体的大小必须能够被该值整除。

tip.NET环境编程tip

任何.NET环境下编写的程序都需要安装.NET框架才能运行(注意默认情况下C++语言编写的程序不需要.NET框架的CLR即运行,通过制定一个新的开关,C++编译器也能够产生出需要CLR才能执行的托管模块),我们可以通过再%windir%\system32目录下查找MSCorEE.dll文件来判断该机器是否安装了.NET框架。如果存在则证明已安装。如果想确定安装了哪些版本的.NET框架,可以查看如下注册表键下的子键:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\policy

tipC VS .NET

C语言运行时堆分配内存基于链表,.NET CLR托管堆分配则基于连续的内存块,故.NET分配对象要比C快得多;
.NET在垃圾回收后要用到memcpy函数压缩托管堆,所以会给应用程序带来不小的性能损伤,其性能比C运行时的堆的性能低。

tip指针的强制类型转换

在指针的强制类型转换:ptr1=(TYPE*)ptr2中,如果sizeof(ptr2的类型)大于sizeof(ptr1的类型),那么在使用指针ptr1来访问ptr2所指向的存储区时是安全的。如果sizeof(ptr2的类型)小于sizeof(ptr1的类型),那么在使用指针ptr1 来访问ptr2所指向的存储区时是不安全的。

tipWin32平台下的微软C编译器(cl.exe for 80x86)在默认情况下采用如下的对齐规则

任何基本数据类型T的对齐模数就是T的大小,即sizeof(T)。比如对于double类型(8字节),就要求该类型数据的地址总是8的倍数,而char类型数据(1字节)则可以从任何一个地址开始。Linux下的GCC奉行的是另外一套规则(在资料中查得,并未验证,如错误请指正):任何2字节大小(包括单字节吗?)的数据类型(比如short)的对齐模数是2,而其它所有超过2字节的数据类型(比如long,double)都以4为对齐模数。

tip"精确制导"

通过关闭一个局部作用域(比如一对花括号"{}"),你可以精确控制变量的析构函数何时调用。

tip抽象类

抽象类是不能定义对象的,在实际中为了强调一个类是抽象类,可将该类的构造函数说明为保护的访问控制权限。

抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类没有重新定义纯虚函数,而派生类只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体类了。

tip类非内建类型成员的初始化

类非内建类型(如string类型)成员的初始化采用(1)形式比采用形式(2)可以获得大概30%的效率提升;
形式(1):
Employee::Employee(const String& nm) : name(nm) { }
形式(2):
Employee::Emplogyee(const String& nm) { name = nm; }
形式(2)会对name成员进行两次关于string的操作(一次初始化一次赋值)。

tip...

当两个操作数都是操作的输入,并且没有一个会受到操作的影响,那么我们最好将改操作符定义为一个非成员函数。这样可以确保在有隐式转换的条件下,这两个操作数都可以以同样的方式来进行操作。

tip...

将一个未命名的临时对象作为一个非常量指针传递给以常量作为参数的函数是非法的。

tip...

如果基类中的析构函数不是虚拟的,那么通过一个指针来进行的删除动作将不能调用到正确的那个派生类中的析构函数。

tip宏字符#

#是一个字符串化操作符,将宏的参数转换为字符串常量。

tipVisual Studio快捷键
Crtl+J 输入补全
Crtl+K, Crtl+I 呼出相关信息提示
Crtl+K, Crtl+P 呼出参数信息
Shift+Alt+o 查找文件(AssistX?)
Crtl+I 快速查找
Crtl+Shift+V 呼出最近20条剪贴板记录
Crtl+W 选定光标所处单词
Ctrl+M, Ctrl+M 折叠代码
Crlt+M, Ctrl+L 折叠该文件所有代码
Crtl+L 剪切行
Ctrl+Shift+L 删除行
Alt+G 跳至函数定义/上一个和下一个光标位置切换

tipVC从硬盘加载一张位图的方法:
HBITMAP hBmp;
CBitmap Bitmap;

hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), "./res/bv.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
Bitmap.DeleteObject();
if(!Bitmap.Attach(hBmp))
{
AfxMessageBox("Error to attach a Bitmap");
}

tipASCII特殊字符

数值 8、9、10 和 13 可以分别转换为退格符、制表符、换行符和回车符。这些字符都没有图形表示,但是对于不同的应用程序,这些字符可能会影响文本的显示效果。

tip可编程内存类型

可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。
静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。
栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。
对于堆区、栈区和静态存储区它们之间最大的不同在于,栈的生命周期很短暂。但是堆区和静态存储区的生命周期相当于与程序的生命同时存在(如果您不在程序运行中间将堆内存delete的话),我们将这种变量或数据成为全局变量或数据。

tipVS中使用预编译文件
1. 在工程级别设置预编译文件的名称,并且设置预编译头文件的名称(如stdafx.h),并设置工程Yu(“使用”)标记;
2. 在文件级别(如stdafx.cpp)设置由该文件生成预编译头,设置该文件Yc(“生成”)标记即可;
3. 要生成预编译头xxx.pch只要选择上述文件(stdafx.cpp),单独编译就可以了。

tipusing namespace作用域
哪个文件写了using namespace std,那个文件就引入了这个名字空间,跟其他文件没关系。

tip安装vs2003常见问题
1. 安装时读写注册表过不去
在注册表中删除HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\pendingfilerenameoperations即可;
2. 安装后出现读取Accessibility错误
复制:C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Accessibility.dll到:C:/Program Files/Microsoft Visual Studio .NET 2003/Common7/IDE/解决问题;
或者重新安装 Microsoft.NET Framework;

tipfopen二进制("b")和文本方式("t")的区别
二进制方式很简单,读文件时,会原封不动的读出文件的全部內容,写的時候,也是把內存缓冲区的內容原封不动的写到文件中。
文本方式就不一样了,在写文件时,会将换行符号CRLF(0x0D 0x0A)全部转换成单个的0x0A,并且当遇到结束符CTRLZ(0x1A)时,就认为文件已经结束。相应的,写文件时,会将所有的0x0A换成0x0D0x0A。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值