如何使用C/C++创建回调函数

How to create a Callback function by Using C/C++

本文关键字:创建 回调 函数 C++ 何使用      更新时间:2023-10-16

C:\C++是否支持回调函数机制?以及如何创建它?我写了几段代码,用C++创建回调函数,但失败了。。

    #include<iostream>
    using namespace std;
    void callee()
    {
         printf("calleen"); 
         printf("calleeeeeeeeeen"); 
    }
    void callback(void* func)
    {
         printf("callbackn");     
    }
    int main()
    {
        void (*call)(void*);
        void (*call2)(void);
        call2 = &callee;
        call = &callback;
        call((void*)call2);    
        getchar();
        return 0;    
    }

我不懂C++,我写了一些C代码,希望它能帮助

#include <stdio.h>
void call( int, void ( *f )( int ) );
void called( int );
int main( int argc, char const *argv[] ){
    printf( "startn" );
    call( 1, called );
    printf( "endn" );
    getchar();
    return 0;
}
void call( int a, void ( *f )( int ) ){
    printf( "doing stuffn" );
    printf( "a: %dn", a );
    printf( "going to call backn" );
    f( a * 2 );
}
void called( int b ){
    printf( "b: %dn", b );
    printf( "b*2: %dn", b*2 );
    printf( "call back function being calledn" );
}

调用函数中的回调函数只不过是拥有一个函数指针,并在完成计划工作时调用该函数。

我修改了代码,使其更加清晰,以显示如何使用回调
如果你编译并运行它,这就是你将看到的结果:

start
doing stuff
a: 1
going to call back
b: 2
b*2: 4
call back function being called
end

好吧,要么是作者编辑了这个问题,要么是有人为他编辑了它,不再有C标签了。如果您不想看到纯C代码,请忽略此答案。我只想把它留在这里,以防有人感兴趣

好吧,您从未调用过"callee"-您用"call(void*)call2);"执行了"callback",但为了执行您的"被调用者"函数,您需要在"callback"函数。在这里,这个工作:

#include <iostream>
#include <stdio.h>
using namespace std;
void callee()
{
     printf("calleen");
     printf("calleeeeeeeeeen");
}
void callback(void* func)
{
    void (*mCallbackFunc)(void);
    printf("callbackn");
    mCallbackFunc = (void(*)())func;
    mCallbackFunc();
}
int main()
{
    void (*call)(void*);
    void (*call2)(void);
    call2 = &callee;
    call = &callback;
    call((void*)call2);
    return 0;
}

输出:

callback
callee
calleeeeeeeeee

下面是一个使用接口回调的示例。

//listener observer design pattern
class MonitoringElements{
public:
//information to monitor
};
class ICondition{
public:
    virtual ~ICondition(){}
    virtual bool didTrigger(const MonitoringElements& current) = 0;
    virtual void risingEdge() = 0;
};
class MonitorManager final{
public:

    void addCondition(ICondition* condition){
        m_conditions.push_back(condition);
    }
    //constantly monitoring every x seconds
    void monitorOnce(){
        update();
        for(int i = 0; i < m_conditions.size(); ++i)
            if(m_conditions.at(i)->didTrigger(m_monitorElements)){
                m_conditions.at(i)->risingEdge();
            }
    }
private:
    void update(){
        //read sensor values here
        //update m_monitorElements;
    }
    MonitoringElements m_monitorElements;
    std::vector<ICondition*> m_conditions;
};