一些程序实用的小技巧

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