惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
阮一峰的网络日志
阮一峰的网络日志
IT之家
IT之家
人人都是产品经理
人人都是产品经理
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 【当耐特】
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
博客园 - 叶小钗
罗磊的独立博客
宝玉的分享
宝玉的分享
月光博客
月光博客
V
V2EX
博客园 - 司徒正美
Vercel News
Vercel News
量子位
Y
Y Combinator Blog
美团技术团队
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Tailwind CSS Blog
博客园 - Franky
小众软件
小众软件
I
InfoQ
A
About on SuperTechFans

博客园 - StationaryTraveller

如何查找微软VS软件中的图标 SQLite 的自增(AUTOINCREMENT)强制要求列的数据类型必须是INTEGER Qt动态获取翻译文本 Windows判断某窗口是否被其他窗口完全覆盖 MFC实现一个通用模态进度条窗口 如何批量修改“后期生成事件”为“预生成事件” MFC对话框中如何给一个控件发送消息 Window剪切板 Qt程序系统文本翻译 SVN创建分支 Qt多版本如何共存 Qt6编译的程序在某些win10系统报错 电脑忘机了用户名密码怎么办 Qt事件过滤器实现空闲检测 CMFCToolTipCtrl的AddTool导致内存增加 MFC中CBitmap、CBrush、CFont、CPalette、CPen、CRgn删除GDI对象问题 实现从QListWidgett拖拽项到QTableWidget Windows系统下通过命令行获取进程指标 命令模式实现撤销和重做机制 避免溢出求平均值的算法 字节流转16进制字符串 PImpl:Pointer to Implementation C++单例
C语言根据函数指针偏移实现函数动态调用
StationaryTraveller · 2025-07-21 · via 博客园 - StationaryTraveller
#include<stdbool.h>
#include<stdio.h>
#include<stdint.h>
typedef struct tagTest
{
    float                f1;
    float                f2;
    bool                 b3;
}TEST_T;

void test(TEST_T* p)
{
    p->f1 = 50.0;
    p->f2 = 80.0;
    p->b3 = false;

}

int add(int a, int b)
{
    return a + b;
}

unsigned int address[100];


#define FUNCTION_TYPEDEF(name, returntype, ...) typedef returntype (*name##_FP)(__VA_ARGS__); //函数指针通用声明

FUNCTION_TYPEDEF(Test, void, ...)//定义函数指针
#define Test(...) ((##Test##_FP)((unsigned int*)(BASE_ADDR+address[0])))(__VA_ARGS__)//定义函数调用

FUNCTION_TYPEDEF(AddTest, int, int, int)//定义函数指针
#define AddTest(...) ((##AddTest##_FP)((unsigned int*)(BASE_ADDR+address[1])))(__VA_ARGS__)//定义函数调用

int main()
{
    char* BASE_ADDR = 0;
    address[0] = (unsigned int)test;
    address[1] = (unsigned int)add;


    TEST_T t = {0};

    Test(&t);

    printf("t.f1 = %f\n", t.f1);

    printf("add result = %d\n", AddTest(5, 10));
    
    return 0;

}