按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
END_CATCH_ALL
THROW 宏相当于C++ 语言中的throw 指令;你以什么类型做为THROW 的参数,就
会有一个相对应的AfxThrow_ 函数被调用(这是台面下的行为):
MFC Exception Type MFC Throw Function DOS support Windows support
CException v v
CMemoryException AfxThrowMemoryException v v
CFileException AfxThrowFileException v v
CArchiveException AfxThrowArchiveException v v
CNotSupportedException AfxThrowNotSupportedException v v
CResourceException AfxThrowResourceException v
COleException AfxThrowOleException v
COleDispatchException AfxThrowOleDispatchException v
CDBException AfxThrowDBException v
CDaoException AfxThrowDaoException v
CUserException AfxThrowUserException v
以下是MFC 4。x 的exceptions 宏定义:
// in AFX。H
////////////////////////////////////////////////////////////////////////
// Exception macros using try; catch and throw
// (for backward patibility to previous versions of MFC)
#ifndef _AFX_OLD_EXCEPTIONS
#define TRY { AFX_EXCEPTION_LINK _afxExceptionLink; try {
98
…………………………………………………………Page 161……………………………………………………………
第2章 C++ 的重要性伲�
#define CATCH(class; e) } catch (class* e)
{ ASSERT(e…》IsKindOf(RUNTIME_CLASS(class)));
_afxExceptionLink。m_pException = e;
#define AND_CATCH(class; e) } catch (class* e)
{ ASSERT(e…》IsKindOf(RUNTIME_CLASS(class)));
_afxExceptionLink。m_pException = e;
#define END_CATCH } }
#define THROW(e) throw e
#define THROW_LAST() (AfxThrowLastCleanup(); throw)
// Advanced macros for smaller code
#define CATCH_ALL(e) } catch (CException* e)
{ { ASSERT(e…》IsKindOf(RUNTIME_CLASS(CException)));
_afxExceptionLink。m_pException = e;
#define AND_CATCH_ALL(e) } catch (CException* e)
{ { ASSERT(e…》IsKindOf(RUNTIME_CLASS(CException)));
_afxExceptionLink。m_pException = e;
#define END_CATCH_ALL } } }
#define END_TRY } catch (CException* e)
{ ASSERT(e…》IsKindOf(RUNTIME_CLASS(CException)));
_afxExceptionLink。m_pException = e; } }
#else //_AFX_OLD_EXCEPTIONS
////////////////////////////////////////////////////////////////////////
// Exception macros using setjmp and longjmp
// (for portability to pilers with no support for C++ exception handling)
#define TRY
{ AFX_EXCEPTION_LINK _afxExceptionLink;
if (::setjmp(_afxExceptionLink。m_jumpBuf) == 0)
#define CATCH(class; e)
else if (::AfxCatchProc(RUNTIME_CLASS(class)))
{ class* e = (class*)_afxExceptionLink。m_pException;
#define AND_CATCH(class; e)
} else if (::AfxCatchProc(RUNTIME_CLASS(class)))
{ class* e = (class*)_afxExceptionLink。m_pException;
99
…………………………………………………………Page 162……………………………………………………………
第篇 勿在浮砂築高台
#define END_CATCH
} else { ::AfxThrow(NULL); } }
#define THROW(e) AfxThrow(e)
#define THROW_LAST() AfxThrow(NULL)
// Advanced macros for smaller code
#define CATCH_ALL(e)
else { CException* e = _afxExceptionLink。m_pException;
#define AND_CATCH_ALL(e)
} else { CException* e = _afxExceptionLink。m_pException;
#define END_CATCH_ALL } }
#define END_TRY }
#endif //_AFX_OLD_EXCEPTIONS
Template
这并不是一本C++ 书籍,我也并不打算介绍太多距离「运用MFC 」主题太远的C++ 论
题。Template 虽然很重要,但它与「运用MFC 」有什么关系?有!第8章当我们开始
设计Scribble 程序时,需要用到MFC 的collection classes ,而这一组类别自从MFC 3。0
以来就有了template 版本(因为Visual C++ 编译器从2。0 版开始支持C++ template)。
运用之前,我们总该了解一下新的语法、精神、以及应用。
好,到底什么是template?重要性如何?Kaare Christian 在1994/01/25 的PC…Magazine
上有一篇文章,说得很好:
无性生殖并不只是存在于遗传工程上,对程序员而言它也是一个由来已久的动作。过去,
我们只不过是以一个简单而基本的工具,也就是一个文字编辑器,重制我们的程序代码。
今天,C++ 提供给我们一个更好的繁殖方法:template 。
复制一段既有程序代码的一个最平常的理由就是为了改变数据类型。举个例子,假设你写
了一个绘图函数,使用整数x; y 坐标;突然之间你需要相同的程序代码,但坐标值改采
100
…………………………………………………………Page 163……………………………………………………………
第2章 C++ 的重要性伲�
long。你当然可以使用一个文字编辑器把这段码拷贝一份,然后把其中的数据类型改变
过来。有了C++,你甚至可以使用多载(overloaded )函数,那么你就可以仍旧使用相