代码编写风格原则
一、 命名原则
1.
宏所有字母都应大写,各个单词间用下划线连接。 如: #define
PI
3.14159265
C开头,没有下划线。每个新词都以大
2. 类名以大写字母
写字母开头。类名应有意义,易于相互理解。 如:class CFontDialog
3. 方法(即函数)名以大写字母开头,没有下划线。每个新
词都以大写字母开头,方法名应该有一定意义。 如:SetFontSize(int nSize)
4.
成员变量名应以 m_ 开头; 如: m_hWnd
接口名以大写字母I开头,没有下划线。每个新词
5. Com
都以大写字母开关。接口名应有意义,易于理解和记忆。 如:ITest
二、 代码改动注明原则
当有 Bugs 被测试发现后,需要修改源代码,必须在修改处注明修改日期、修改者姓名、修改的问题以及原因。 三、 函数、变量等说明原则
对代码的说明,这里不作硬性规定,基本要求:大家尽量的在代码中加一定的说明,以便于您的合作者容易理解您的思想,特别是一些很模糊(函数功能不是一目了然)的地方。
四、 模块包装原则
在开发过程中大家提供各种处理功能时,尽量不使用源代码Copy 方式相互提供(或引用),而使用库(或Com)方式(包括执行文件引用方式)。这主要是因为使用源代码 Copy 时很容易改变代码(有意或无意)而使有些 Bugs 重复出现,模块包装时应该提供尽量简洁的连接文件,一般最好只提供一个“.H”文件,一个“.LIB”(Com方式为“.TLB”)和“.DLL”(或“.EXE” )文件。
以上原则为研发部代码编写的基本要求,这些基本要求的实施和监督将主要通过大家相互协作的过程中相互提议来实现。此外,当研发部将某些模块提交软件部前,应该对模块的文档进一步完善,提交后,软件部将对此模块的规范性再作考核。
五、特殊补充
1、对于 MFC 的 CString 的使用:
因为 CString 在程序执行中是动态分配内存的,也就是说 CString 中描述的字符串在内存中的位置是不定的,同时所使用的内存大小也是不定的,这极大地影响程序的稳定性,所有我们规定:
在函数参数中 不许使用 CString 在定义全局变量中 不许使用 CString 在结构定义中 不许使用 CString 在类成员变量中 不许使用 CString 在函数返回结果中 不许使用 CString
2、对于在算法库中 MFC 的使用:
因为 MFC 库本身有 Debug 和 Release 的区别,而且 Debug 和 Release 是不能相互代替的,而我们的算法一般是要兼容 Debug 和 Release ,所有我们建议在编写算法库时不使用 MFC。
附 (开发环境为 MS VC++ 6.0 )
编写 DLL 动态连接库的方法
1、 新建工程时,选择 MFC AppWizard(dll) (若不要 MFC 选择
Win32 Dynamic-link libray ) 2、 新建您要提供的类和函数
3、 在类名称前加入宏( 定义为 __declspec(dllexport) ) 4、 函数定义请使用:
extern \ FAR PASCAL EXPORT FunctionName() 并在 “.def ”文件中的 EXPORT 一行后,加入函数名称,每个函数名称一行。 5、 编写实现功能
6、 编译即可
eg.
//TestDll.h 头文件 #ifndef TESTDLL_LIB
#define TESTDLL_LIB __declspec(dllexport) #endif
class TESTDLL_LIB CtestDll {
public: CtestDll(){};
Virtual ~CtestDll(){}; int func1(){};
int func2(){}; …. };
extern “C” int FAR PASCAL EXPORT MyFunc1(int par1);
// TestDll.cpp 实现文件
extern “C” int FAR PASCAL EXPORT MyFunc1(int par1) { return 1; }
引用 DLL 动态库的方法
引用 DLL 有两种方法,显式与隐式
显式引用要求 DLL 调用者自己在 DLL 种定位函数入口,优点为 DLL 库重新改变后不影响以前的调用。隐式引用却在编译时定义好函数入口,DLL 库重新改变后以前的调用将不可用,必须重新编译引用者的代码。 1、 隐式引用
Copy DLL 库的 “.H”和“.LIB”文件到你的工程目录,包含 “.H” 文件,将 “.Lib”加入你工程,即可使用 “.H” 中定义的类、函数、变量等。 2、 显式引用
在你使用 DLL 库中的函数(或变量)时,先定义函数指针,如:typedef UINT(CALLBACK* LPFUNC)(WPARAM,LPARAM); 然后使用 LoadLibrary 载入您的DLL库,再使用GetProcAddress 获取函数的地址,然后方可使用函数。
eg.
MyProc(int par) {
typedef UINT (CALLBACK* LPFUNC)( int ); HINSTANCE hDLL = ::LoadLibrary(\If ( hDLL ) { LPFUNC MyFunc1= (LPFUNC)::GetProcAddress( hDLL,\
If (MyFunc1) MyFunc1(par); ::FreeLibrary( hDLL ); } }
显式引用 class 时比较麻烦,不过可以使用 Com 代替,就方便多了
编写 COM 的方法
1、 新建工程时,选择 ATL COM AppWizard 2、 新建 ATL Object
3、 选择 Object 的类型。如下: