- 浏览: 38807 次
- 性别:
- 来自: 上海
最新评论
用法:
头文件中声明:
DECL_LINK( PaintingFirstLineHdl, PaintFirstLineInfo* );
宏:#define DECL_LINK( Method, ArgType ) \
long Method( ArgType ); \
static long LinkStub##Method( void* pThis, void* )
展开:
long PaintingFirstLineHdl(PaintFirstLineInfo*);
static long LinkStubPaintingFirstLineHdl(void*pThis,void*);
等于声明了两个方法。
CXX文件: IMPL_LINK(OutlineView, PaintingFirstLineHdl, PaintFirstLineInfo*, pInfo)
宏:
#define IMPL_LINK( Class, Method, ArgType, ArgName ) \
IMPL_STUB( Class, Method, ArgType ) \
long Class::Method( ArgType ArgName )
#define IMPL_STUB(Class, Method, ArgType) \
long __EXPORT Class::LinkStub##Method( void* pThis, void* pCaller) \
{ \
return ((Class*)pThis )->Method( (ArgType)pCaller ); \
}
展开:
long_EXPORT OutlineView::LinkStubPaintingFirstLineHdl(void *pThis,void *pCaller)
{
return ((Outlineview*)pThis)->PaintingFirstLineHdl((PaintFirstLineInfo*)pCaller)
}
long OutlineView::PaintingFirstLineHdl(PaintFirstLineInfo* plnfo)
传递函数指针:
Link alink (LINK(this,OutlineView,PaintingFirstLineHdl))
宏:
typedef long (*PSTUB)( void*, void* );
#define LINK( Inst, Class, Member ) Link( (Class*)Inst, (PSTUB)&Class::LinkStub##Member )
展开:
Link((OutlineView*)this,(PSTUB)&OutlineView::LinkStubPaintingFirstLineHdl)
Link类的构造函数: Link( void* pLinkHdl, PSTUB pMemFunc );
pLinkHdl: 对象的地址。
pMemFunc: 指向所要调用的函数指针。
这样把alink传递到任何地方,只要对象还存在就能调用PaintingFirstLineHdl这个方法。
调用:
inline long Link::Call(void *pCaller) const
{
return pFunc ? (*pFunc)(pInst, pCaller) : 0;
}
================
补充:
IMPL_LINK(OutlineView, PaintingFirstLineHdl, PaintFirstLineInfo*, pInfo)
void ImpEditEngine::Paint( OutputDevice* pOutDev, Rectangle aClipRec, Point aStartPos, sal_Bool bStripOnly, short nOrientation )
mpOutliner->SetPaintFirstLineHdl(LINK(this,OutlineView,PaintingFirstLineHdl));
////////////////////////////////////////////////////////////////////////////////////
Link aLink( LINK(this,OutlineView,EventMultiplexerListener) );
mpOutlineViewShell->GetViewShellBase().GetEventMultiplexer()->AddEventListener(
aLink,
tools::EventMultiplexerEvent::EID_CURRENT_PAGE
| tools::EventMultiplexerEvent::EID_PAGE_ORDER);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
赋值:
mpOutliner->SetPaintFirstLineHdl(LINK(this,OutlineView,PaintingFirstLineHdl));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
调用:
inline long Link::Call(void *pCaller) const
{
return pFunc ? (*pFunc)(pInst, pCaller) : 0;
}
构造函数: Link( void* pLinkHdl, PSTUB pMemFunc );
pLinkHdl: 对象的地址。
pMemFunc: 指向所要调用的函数指针。
宏:
typedef long (*PSTUB)( void*, void* );
#define LINK( Inst, Class, Member ) Link( (Class*)Inst, (PSTUB)&Class::LinkStub##Member )
mpOutliner->SetPaintFirstLineHdl(LINK(this,OutlineView,PaintingFirstLineHdl));
Using ## concatenates what's before the ## with what's after it.
展开:Link((OutlineView*)this,(PSTUB)&OutlineView::LinkStub##PaintingFirstLineHdl)
LinkStubPaintingFirstLineHdl
IMPL_LINK(OutlineView, PaintingFirstLineHdl, PaintFirstLineInfo*, pInfo)
按照下面的宏展开:
IMPL_STUB(OutlineView,PaintingFirstLineHdl,PaintFirstLINEInfo*) \
long OutlineView::PaintingFirstLineHdl(PaintFirstLineInfo* plnfo)
////////////////////////////////////////////////////////////////////////////////
long_EXPORT OutlineView::LinkStubPaintingFirstLineHdl(void *pThis,void *pCaller){
return ((Outlineview*)pThis)->Method((argType)pCaller) }\
long OutlineView::PaintingFirstLineHdl(PaintFirstLineInfo* plnfo)
////////////////////////////////////////////////////////////////////////////
#define IMPL_LINK( Class, Method, ArgType, ArgName ) \
IMPL_STUB( Class, Method, ArgType ) \
long Class::Method( ArgType ArgName )
#define IMPL_STUB(Class, Method, ArgType) \
long __EXPORT Class::LinkStub##Method( void* pThis, void* pCaller) \
{ \
return ((Class*)pThis )->Method( (ArgType)pCaller ); \
}
头文件中声明:
DECL_LINK( PaintingFirstLineHdl, PaintFirstLineInfo* );
宏:#define DECL_LINK( Method, ArgType ) \
long Method( ArgType ); \
static long LinkStub##Method( void* pThis, void* )
展开:
long PaintingFirstLineHdl(PaintFirstLineInfo*);
static long LinkStubPaintingFirstLineHdl(void*pThis,void*);
等于声明了两个方法。
CXX文件: IMPL_LINK(OutlineView, PaintingFirstLineHdl, PaintFirstLineInfo*, pInfo)
宏:
#define IMPL_LINK( Class, Method, ArgType, ArgName ) \
IMPL_STUB( Class, Method, ArgType ) \
long Class::Method( ArgType ArgName )
#define IMPL_STUB(Class, Method, ArgType) \
long __EXPORT Class::LinkStub##Method( void* pThis, void* pCaller) \
{ \
return ((Class*)pThis )->Method( (ArgType)pCaller ); \
}
展开:
long_EXPORT OutlineView::LinkStubPaintingFirstLineHdl(void *pThis,void *pCaller)
{
return ((Outlineview*)pThis)->PaintingFirstLineHdl((PaintFirstLineInfo*)pCaller)
}
long OutlineView::PaintingFirstLineHdl(PaintFirstLineInfo* plnfo)
传递函数指针:
Link alink (LINK(this,OutlineView,PaintingFirstLineHdl))
宏:
typedef long (*PSTUB)( void*, void* );
#define LINK( Inst, Class, Member ) Link( (Class*)Inst, (PSTUB)&Class::LinkStub##Member )
展开:
Link((OutlineView*)this,(PSTUB)&OutlineView::LinkStubPaintingFirstLineHdl)
Link类的构造函数: Link( void* pLinkHdl, PSTUB pMemFunc );
pLinkHdl: 对象的地址。
pMemFunc: 指向所要调用的函数指针。
这样把alink传递到任何地方,只要对象还存在就能调用PaintingFirstLineHdl这个方法。
调用:
inline long Link::Call(void *pCaller) const
{
return pFunc ? (*pFunc)(pInst, pCaller) : 0;
}
================
补充:
IMPL_LINK(OutlineView, PaintingFirstLineHdl, PaintFirstLineInfo*, pInfo)
void ImpEditEngine::Paint( OutputDevice* pOutDev, Rectangle aClipRec, Point aStartPos, sal_Bool bStripOnly, short nOrientation )
mpOutliner->SetPaintFirstLineHdl(LINK(this,OutlineView,PaintingFirstLineHdl));
////////////////////////////////////////////////////////////////////////////////////
Link aLink( LINK(this,OutlineView,EventMultiplexerListener) );
mpOutlineViewShell->GetViewShellBase().GetEventMultiplexer()->AddEventListener(
aLink,
tools::EventMultiplexerEvent::EID_CURRENT_PAGE
| tools::EventMultiplexerEvent::EID_PAGE_ORDER);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
赋值:
mpOutliner->SetPaintFirstLineHdl(LINK(this,OutlineView,PaintingFirstLineHdl));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
调用:
inline long Link::Call(void *pCaller) const
{
return pFunc ? (*pFunc)(pInst, pCaller) : 0;
}
构造函数: Link( void* pLinkHdl, PSTUB pMemFunc );
pLinkHdl: 对象的地址。
pMemFunc: 指向所要调用的函数指针。
宏:
typedef long (*PSTUB)( void*, void* );
#define LINK( Inst, Class, Member ) Link( (Class*)Inst, (PSTUB)&Class::LinkStub##Member )
mpOutliner->SetPaintFirstLineHdl(LINK(this,OutlineView,PaintingFirstLineHdl));
Using ## concatenates what's before the ## with what's after it.
展开:Link((OutlineView*)this,(PSTUB)&OutlineView::LinkStub##PaintingFirstLineHdl)
LinkStubPaintingFirstLineHdl
IMPL_LINK(OutlineView, PaintingFirstLineHdl, PaintFirstLineInfo*, pInfo)
按照下面的宏展开:
IMPL_STUB(OutlineView,PaintingFirstLineHdl,PaintFirstLINEInfo*) \
long OutlineView::PaintingFirstLineHdl(PaintFirstLineInfo* plnfo)
////////////////////////////////////////////////////////////////////////////////
long_EXPORT OutlineView::LinkStubPaintingFirstLineHdl(void *pThis,void *pCaller){
return ((Outlineview*)pThis)->Method((argType)pCaller) }\
long OutlineView::PaintingFirstLineHdl(PaintFirstLineInfo* plnfo)
////////////////////////////////////////////////////////////////////////////
#define IMPL_LINK( Class, Method, ArgType, ArgName ) \
IMPL_STUB( Class, Method, ArgType ) \
long Class::Method( ArgType ArgName )
#define IMPL_STUB(Class, Method, ArgType) \
long __EXPORT Class::LinkStub##Method( void* pThis, void* pCaller) \
{ \
return ((Class*)pThis )->Method( (ArgType)pCaller ); \
}
发表评论
-
指针 多维数组
2012-06-05 16:12 721这篇文章写的很好 http://www.cnblogs.com ... -
pImp
2011-11-08 17:24 865http://www.cnblogs.com/JulyZhan ... -
关于构造函数,析构函数,explicit等内容
2011-11-01 17:04 1222一.编译器会为我们做什 ... -
C语言标准
2011-10-21 12:11 12221.K&R C 1978年,丹尼斯·里奇(Dennis ... -
对话框工厂
2011-10-14 18:00 6711.对于工厂我的理解: 良好的封装性。使用和创建,初始化分开。 ... -
typedef和指针结合
2011-10-14 17:42 8031. typedef (int *) pInt; 2.type ... -
const的理解和应用
2011-10-14 16:52 1326const的理解和应用 一.理解 const是一种语义上的约束 ... -
空指针的判断
2011-10-11 17:43 929请看NULL的定义: #if !defined(__cp ... -
GUN C 和 ANSI C的几个区别
2011-10-11 10:52 1103http://hi.baidu.com/deep_pro/bl ... -
浮点数的比较
2011-10-11 10:48 1241一浮点数的知识 1.首先浮点数不用补码表示,只有int型才用补 ... -
关于字符串倒转
2011-10-10 20:25 788有纯倒转,也有按单词为单位的。想做个总结 #inclu ... -
C数组和指针的区别
2011-10-10 19:25 723看《C专家编程》总结的的。 首先是个经典的例子: 一个文件定义 ... -
不用中间变量交换数据
2011-10-10 14:42 666那种加加减减的方法其实不对。因为缩小了数据范围。 a1=a1+ ... -
C++模板
2011-10-08 15:52 649template是关键字,template ... -
Quick Sort(快速排序)
2011-10-08 11:20 696Quick Sort算法描述如下: 假设S代表将被处理的序列 ... -
约瑟夫环的解答
2011-10-07 22:48 647http://blog.csdn.net/kittyjie/a ... -
Linux判断大小尾数(big-endian,little-endian)的方法
2011-10-07 22:12 1509static union { char c[4]; u ... -
c++基本文件操作
2011-09-30 00:28 780#include<iostream> #incl ... -
关于文件操作的头文件,类
2011-09-27 14:11 1097C++ 可以看这个 http://www.cplusplus. ... -
关于回车,换行,EOF
2011-09-26 17:41 2802回车换行: http://www.cnblogs.com/fa ...
相关推荐
利用函数指针实现C的回调函数,实现调用者和底层驱动的解耦 第二种方式利用函数指针实现C的回调函数,实现调用者和底层驱动的解耦 第二种方式利用函数指针实现C的回调函数,实现调用者和底层驱动的解耦 第二种方式
在C++编程中,函数指针是一个非常重要的概念,它允许我们存储函数的地址并可以在之后的代码中调用。...函数指针和回调是C++编程中的强大工具,理解并熟练掌握它们能够帮助我们编写更加灵活和高效的应用程序。
在事件驱动编程中,函数指针可以用于回调函数,当特定事件发生时,调用对应的处理函数。此外,它们也常用于实现策略模式、工厂模式等设计模式。 了解和熟练掌握指针函数和函数指针变量是C语言高级编程的关键,它们...
函数指针&回调函数培训讲义,帮助学习函数指针以及回调函数。
函数指针在C++中提供了强大的功能,特别是在处理回调函数或实现策略模式时。理解一般函数指针和类的成员函数指针之间的区别,能够帮助开发者更灵活地设计和实现程序逻辑。尤其是当涉及到类的非静态成员函数时,需要...
函数指针不仅可以作为局部变量,还可以作为函数的参数,实现对回调函数的传递。这在设计模块化、可扩展的系统时尤为有用。例如: ```cpp int test2(int(*ra)(int), int b); ``` 这里,`ra`是一个函数指针参数,...
利用函数指针实现C的回调函数,实现调用者和底层驱动的解耦第一种方式利用函数指针实现C的回调函数,实现调用者和底层驱动的解耦第一种方式利用函数指针实现C的回调函数,实现调用者和底层驱动的解耦第一种方式利用...
在实际应用中,函数指针和函数对象都可以用于实现回调函数、事件处理和其他高级编程技术。但是,函数指针更适合用于简单的回调函数,而函数对象更适合用于复杂的业务逻辑和算法实现。 函数指针和函数对象是C++语言...
在C/C++编程语言中,函数指针和指针函数是两个不同的概念,虽然它们都涉及到指针和函数,但其用法和含义各有特点。理解这两者的差异对于编写高效、灵活的代码至关重要。 首先,我们来解释"函数指针"。函数指针是一...
总之,函数指针和指针函数是C语言中高级的编程工具,它们增加了代码的灵活性和可扩展性,常用于回调函数、动态调度、数据结构(如链表)的实现等场景。理解和熟练掌握这些概念对于深入理解C语言及其在复杂系统中的...
此外,函数指针还可以作为其他函数的参数,实现回调机制,或者在数据结构(如链表)中存储函数指针以实现特定操作。 2. **指针函数** 常用于返回内存分配的结果、数组的某个元素的地址或者结构体的某个字段的地址等...
4. 使用 OVERLAY 指令确定调用树:在 C51 编程中,使用 OVERLAY 指令可以确定调用树,并实现函数指针的调用。 5. 再入函数的指针:再入函数是指在函数内部调用自己本身的函数。函数指针可以用来实现再入函数的调用...
在实际编程中,理解函数指针的这些概念至关重要,因为它们是许多高级C++技术的基础,如回调、事件处理和模板元编程。`函数指针.cpp`、`StdAfx.cpp`、`函数指针.dsp`、`函数指针.dsw`和`StdAfx.h`等文件可能包含示例...
这段代码实现了通过函数指针找到多个输入数字中的最大值。首先定义了一个函数指针 `p`,然后将其赋值为 `f` 函数的地址。接下来通过循环读取数字,并使用函数指针 `p` 调用 `f` 函数来确定最大值。 通过以上介绍,...
4. **类函数的使用场景**:类函数指针在事件处理、异步操作、回调函数等方面有广泛应用。例如,我们可以创建一个消息队列,每个消息包含一个类函数指针,根据不同的消息调用不同的处理函数。 5. **Windows API的...
3. **函数指针**:在实现回调函数、策略模式等设计模式时非常有用。 4. **指针函数**:通常用于返回动态分配的数组或其他复杂数据结构。 通过上述分析,我们可以看出指针虽然看似复杂,但其实有着明确的定义和规则...
通过函数指针,我们可以在运行时动态地调用不同的函数,这在处理回调函数、算法比较或实现多态性时特别有用。例如,我们可以定义一个函数指针类型,然后声明并初始化一个函数指针变量: ```c++ // 定义一个返回整型...
在C语言中,函数指针和指针函数是两个重要的概念,它们经常出现在较为复杂的程序设计中,尤其在回调函数、动态绑定等场景中发挥着重要作用。 **函数指针**指的是指向函数的指针变量,它存储的是函数的入口地址。当...
C语言指针函数和函数指针详细介绍 C语言中指针函数和函数指针是两个不同的概念,但它们之间存在着紧密的联系。本文将对C语言中的指针函数和函数指针进行详细的介绍。 一、指针函数 指针函数是指返回值为指针的...
回调函数是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的...