程序设计10个小技巧
一些程序实用的小技巧
Author: 自由骑士Duzhi
1: 不需要编译的结构(目的是减少编译时间)
假设A.h 中有个结构struct S{},该头文件被多个文件包含,则一修改S,将需要进行大面积的重新编译.技巧是:
A.h 中 void * m_pSHandle;
A.cpp中
struct S{ XXXX, XXXX }
S& GetSHandle(void * pSHandle){ return ((S)pSHandle) }; // 提供类调用
附值和释放处理
A() : m_pSHandle( new S ){};
~A(){ delete ((S*)m_pSHandle); }
这样的话,无论我们如何修改S,因为它在CPP中,都不会重新编译.注意几点,第一,GetSHandle函数不可在头文件声明,注意指针类型转换.
2:退出程序时运行的代码
atexit( fun() )这个函数中就可以实现程序退出后额外运行的一段fun()代码.若我们多处调用它,它将会把调用地函数指针压入栈,逆序调用,我们在New对象的时候,有一个原则一般是”先New的最后释放,后New的先释放”,对于重重继承的类来说也是如此,在实际工作中,大量的对象需要释放时,先后顺序难以控制,就可以在Create的同时,将它注册到这个栈中,释放时顺序会有保障.
3: 单键
在C++范性编程思想和设计书中,在设计模式的书中,讲了起码23种不同的设计模式,因为能力关系,个人仅理解了Singleton的一些皮毛,大致思想是:使用静态对象常量以保证对象的唯一性,利用静态常量仅可进行第一次初始化的特性.例:
class A{
static A& Inst(){ static A a = NULL; return a; } // 单键
static Init(){ Inst() = new A();} // 初始化工作
static Unit(){ delete Inst(); Inst() = NULL; } // 释放销毁
}
当然,完整的单键类还要考虑自动计数释放,多线程冲突解决等东西,具体可参考C++编程思维和设计书目.
4:类函数指针,回调函数的使用
基本的不想解释了,只给出代码.
非类内的回调:
typedef void(*FUN)(int); // 类型声明
FUN pFun; // 函数指针声明
void Caller( FUN p ){ p(); } // 调用器的实声明现
void FunA(){ TODO: } // 函数A声明和实现
void FunB(){ TODO: } // 函数B声明和实现
main(){ pFun = &FunA; Caller(pFun); } // 函数指针的附值和调用
类内的回调用:
typedef void( A::*FUN)(int); // 类型声明
FUN m_pFun; // 函数指针声明
void A::Caller( FUN p ){ (this->*p)(); } // 调用器的实声明现
void A::FunA(){ TODO: } // 函数A声明和实现
void A::FunB(){ TODO: } // 函数B声明和实现
main(){ pFun = &A::FunA; Caller(pFun); } // 函数指针的附值和调用
5:模板的使用
现在编辑器不支持C++标准的摸板导入关键字,导致摸板类都必须写在头文件,一大堆看着郁闷,所以可以仿效.h, .cpp的模式如下使用,.h进行摸板的声明,另建一个.h 文件,改后缀.inl,里面写实现. 实际上,.inl文件就是.h,两者没有任何区别.
6:使用VAssistX节省时间
打开VC的IDE,VAssistX -> Visual Assist X Options设置 -> AutoTexts/Templates -> C/C++ 添加摸版脚本
例如:
//-2:
///————————-
// @ FunctionName:
// @ Param1:
// @ Param2:
// @ Return:
// @ Comment:
///—————————-
FF
此时我们在编码时输入//-2的话,会自动生成下面的摸版,其中 “:” 分号前的是简码,FF是终止符.总之非常简单使用的东西.
7:VC7打开VC8工程
文本模式打开.vcproj文件,将其中的Version = 8.00 改成 7.10.保存,OK.
- 8:Bat拷贝
:: 开始拷贝
copy ..\Src*.jpg .\Dest
c++中调用bat批处理的方法是
system(“c:\mybat.bat”); 或
cmd(“c:\mybat.bat”);
这样就会将上一层目录下的Src目录中的所有的jpg拷贝到Dest目录中了,是个有时候需要的技巧.
9:软件连接网页
C++中
ShellExecute(NULL, NULL, http://hi.baidu.com/freedomknightduzhi, NULL, NULL, 0);
这样的话就允许在应用程序中进行网页的调用访问了.当然,根据传入的窗口句柄不同,也可实现内嵌窗口
10: 控制台程序不自动关闭的技巧 (在DEBUG模式时经常有点小作用.)
C++
#include “stdlib.h”
system(“pause”);
VC
或者使用Ctrl+F5进行编译.
C#
Console.ReadLine();
bat批处理
pause