jiangsheng

http://www.csdn.net/develop/author/netauthor/jiangsheng/
随笔 - 142, 评论 - 628, 引用 - 27

导航

关于

这下要维护3个BLOG了,faint 其他的地址:

所有的文章版权归原文作者所有,任何人需要转载文章,必须征得原文作者授权。
我的MVP配置

标签

每月存档

最新留言

广告

 

程序员在我看来是比较会偷懒的一个群体。为了在开发软件的时候减少人工操作,他们会使用各种各样的软件和语言特性,例如IDE和预处理宏。李建忠在他的BLOG(http://blog.joycode.com/lijianzhong/archive/2005/05/08/50440.aspx)中提到,为了简化声明属性的工作,他的同事自己写了一些小工具来生成需要的代码。在C++托管扩展中,这个工作稍微简单一些,用预处理宏就可以了。

#define   DECLARE_PROPERTY_DOUBLE_PUBLIC(propertyName)\
protected:\
   double _##propertyName;
public:\
   __property double get_##propertyName(){ return _##propertyName; }\
   __property void set_##propertyName( double new_##propertyName ){ _##propertyName= new_##propertyName; }

public __gc __sealed class Vector {
public:
   // ...
   DECLARE_PROPERTY_DOUBLE(x)
   DECLARE_PROPERTY_DOUBLE(y)
   DECLARE_PROPERTY_DOUBLE(z)

};

当然,如果使用C++/CLI的话,这个工作更加简单:

public ref class Vector sealed
{
public:
    property double x; 
    property double y;
    property double z;
};

我在编程的时候也是个彻底的实用主义者,需要大量重复编写的代码都是尽量用宏实现。例如,我用如下的宏来简化CCmdTarget派生类对IOleCommandTarget类的处理:

#define DECLARE_IOLECOMMANDTARGET\
    STDMETHOD(QueryStatus)(const GUID* pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [],OLECMDTEXT* pcmdtext);\
    STDMETHOD(Exec)(const GUID*,DWORD nCmdID, DWORD nCmdExecOpt,VARIANTARG* pvarargIn, VARIANTARG* pvarargOut);

#define IMPLEMENT_IOLECOMMANDTARGET(theClass,localclass)\
STDMETHODIMP theClass::X##localclass::Exec(const GUID* pguidCmdGroup,DWORD nCmdID, DWORD nCmdExecOpt,VARIANTARG* pvarargIn, VARIANTARG* pvarargOut)\
{\
 METHOD_PROLOGUE_EX(theClass, localclass)\
 ASSERT_VALID(pThis);\
 return pThis->Exec(pguidCmdGroup,nCmdID,nCmdExecOpt,pvarargIn,pvarargOut);\
}\
STDMETHODIMP theClass::X##localclass::QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[],OLECMDTEXT* pcmdtext)\
{\
 METHOD_PROLOGUE_EX(theClass, localclass)\
 ASSERT_VALID(pThis);\
 return pThis->QueryStatus(pguidCmdGroup,cCmds,prgCmds,pcmdtext);\
}

#define IMPLEMENT_LOCALCLASS_UNKNOWN(theClass,localclass) \
STDMETHODIMP_(ULONG) \
theClass::X##localclass::AddRef() \
{ \
 METHOD_PROLOGUE_EX(theClass, localclass) \
 ASSERT_VALID(pThis); \
 return pThis->ExternalAddRef(); \
} \
\
STDMETHODIMP_(ULONG) \
theClass::X##localclass::Release() \
{ \
 METHOD_PROLOGUE_EX(theClass, localclass) \
 ASSERT_VALID(pThis); \
 return pThis->ExternalRelease(); \
} \
STDMETHODIMP theClass::X##localclass::QueryInterface( \
REFIID iid, LPVOID* ppvObj) \
{ \
 METHOD_PROLOGUE_EX(theClass, localclass) \
 ASSERT_VALID(pThis); \
 return pThis->ExternalQueryInterface(&iid, ppvObj); \

这样要在CCmdTarget派生类中实现IOleCommandTarget接口的话,只需要编写实现函数就行了:

//声明
class CScreenCaptureGDI : public CScreenCaptureBase
{
   DECLARE_OLECOMMANDTARGET
……
   DECLARE_INTERFACE_MAP()
   BEGIN_INTERFACE_PART(OleCommandTarget, IOleCommandTarget)
    DECLARE_OLECOMMANDTARGET
    END_INTERFACE_PART(OleCommandTarget)
……
}

//实现

IMPLEMENT_DYNCREATE(CScreenCaptureDirectX, CCmdTarget)

BEGIN_INTERFACE_MAP(CScreenCaptureDirectX, CScreenCaptureBase)
……
 INTERFACE_PART(CScreenCaptureDirectX, IID_IOleCommandTarget , OleCommandTarget)
END_INTERFACE_MAP()

IMPLEMENT_LOCALCLASS_UNKNOWN(CScreenCaptureDirectX,OleCommandTarget)

IMPLEMENT_IOLECOMMANDTARGET(CScreenCaptureDirectX,OleCommandTarget)

和微软知识库文章Q177551(http://support.microsoft.com/kb/177551)比较一下就知道可以少写多少代码了。

MFC对COM接口的宏支持在MFC技术文章TN038(http://msdn.microsoft.com/library/en-us/vclib/html/_MFCNOTES_TN038.asp)中有详细说明。

使用宏在编写程序的时候有时可以减少很多工作量,但是缺点是调试比较麻烦。MFC中包含大量的宏,在编写自己的宏的时候可以作为参考。

打印 | 张贴于 2005-05-08 21:39:00 | Tag:随笔  语言(Language)  C++/CLI/Managed C++ Extension  文档(Documentation)  编译(CodeGen)

留言反馈

#re: 程序员之懒 编辑
那个网站被中国的一些ISP屏蔽了
2005-07-21 12:41:00 | [匿名:jiangsheng]
#re: 程序员之懒 编辑
看到C++那些代码就觉得头晕!!呵呵。。对了,想问贴主,那个
http://*****.blogspot.com 怎的上不了啊?
2005-05-12 06:47:00 | [匿名:CsOver]
#re: 程序员之懒 编辑
写起来爽,读起来累,维护其他人写的这种代码可不是好差事。
2005-05-09 21:49:00 | [匿名:laserman]
#re: 程序员之懒 编辑
only?Where is this word?
2005-05-09 13:27:00 | [匿名:jiangsheng]
#re: 程序员之懒 编辑
there are a big mistake, Macro is not only for write less code.

1.Speed, Speed, always for speed up, the macro is expended in compile time ,not run time.
2.easy to maintain, modify a place , fix any place.

that's why i used to the macro.

2005-05-09 04:31:00 | [匿名:leighsword]
#re: 程序员之懒 编辑
发现从C++过来的程序员都比较懒,我那个C#老同事就是C++过来的:)

C++/CLI对property漂亮的处理显然也是“懒”的代表作:)
2005-05-08 23:41:00 | [匿名:李建忠]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.2.0