C++ 函数指针

  • 函数指针是指向函数的指针变量,它可以用来存储函数的地址,从而允许在程序中动态地调用不同的函数。
  • 定义函数指针的一般语法如:返回类型 (*指针变量名)(参数类型1, 参数类型2, …); // void (*failedCallBack)(int)

  • 回调函数: 函数指针常用于实现回调机制,其中一个函数作为参数传递给另一个函数,以便在特定事件发生时调用。比如,在图形界面库中,可以通过函数指针来定义按钮点击事件的处理函数。
void btnListenerSuccess() {
    std::cout << "btnListenerSuccess" << std::endl;
}

void btnListenerFailed(int code) {
    std::cout << "btnListenerFailed" << std::endl;
}

void RegisterButtonClick(void (*successCallBack)(), void (*failedCallBack)(int)) {
    successCallBack();
    failedCallBack(100);
}

int main() {
    RegisterButtonClick(btnListenerSuccess, btnListenerFailed);
    return 0;
}
  • 策略模式: 函数指针可以用于实现策略模式,通过在运行时选择不同的函数来改变算法的行为。
typedef int (*MathOperation)(int, int);

int Add(int x,int y) {
    return x + y;
}

int Subtract(int x, int y) {
    return x - y;
}

int Calculate(MathOperation operation, int x, int y) {
    return operation(x, y);
}

int main() {
    MathOperation addFunc = Add;
    MathOperation subtractFunc = Subtract;

    std::cout << "Addition result: " << Calculate(addFunc, 5, 3) << std::endl;
    std::cout << "Subtraction result: " << Calculate(subtractFunc, 8, 4) << std::endl;
    std::cout << "Hello, World!" << std::endl;
    return 0;
}
  • 动态加载函数库: 函数指针可以用于动态加载共享库(动态链接库)中的函数,从而实现插件式架构。
    • dl 为 dynamic linking 的缩写
#include 
#include   //动态链接库相关的头文件

typedef void (*PluginFunction)();

int main() {
    std::string currentPath = __FILE__; // 获取当前源文件的绝对路径
    size_t lastSlash = currentPath.rfind('/');
    std::string libraryPath = currentPath.substr(0, lastSlash + 1) + "libTest.so"; // 构建共享库的绝对路径
    //libraryPath: /Users/dxd/workspace/github/Cambodia/libTest.so
    std::cout << "so libraryPath: "<< libraryPath << std::endl;

    std::string libraryPathUntitled = currentPath.substr(0, lastSlash + 1) + "libuntitled.dylib";
    std::cout << "dylib libraryPathUntitled: "<< libraryPathUntitled << std::endl;

    //加载动态库 RTLD_LAZY 表示在运行时进行懒惰链接,即在实际使用到库函数时再进行加载和链接。
    void* pluginHandle = dlopen(libraryPathUntitled.c_str(), RTLD_LAZY);
    std::cout << "pluginHandle: "<< pluginHandle << std::endl;
    if (pluginHandle) {
        //这行代码使用 dlsym 函数从已加载的共享库中获取名为 PluginFunction 的函数的地址,并将其赋值给 pluginFunc 函数指针。
        PluginFunction pluginFunc = (PluginFunction)dlsym(pluginHandle, "hello");
        std::cout << "pluginFunc: "<< pluginFunc << std::endl;
        if (pluginFunc) {
            pluginFunc();
        } else {
            std::cout << "Failed to find function in plugin." << std::endl;
        }
        //关闭先前通过 dlopen 打开的共享库,释放相关资源。
        dlclose(pluginHandle);
    } else {
        std::cout << "Failed to load plugin." << std::endl;
    }

    return 0;
}

你可能感兴趣的:(CPP,c++,驱动开发,开发语言)