C函数,函数指针,函数类型,函数数组,函数强制转换使用

/* 
 * File:   main.cpp
 * Author: Vicky
 *
 */
#include <iostream>
#include <cstdarg>

/** 创建函数类型,可以用于创建函数数组 */
typedef void (*FUNC_t)(int id, int args_size, ...);

void pcreate(int id, int args_size, ...) {
    std::cout << "create" << std::endl;
}

void pread(int id, int args_size, ...) {
    std::cout << "read" << std::endl;
}

void pupdate(int id, int args_size, ...) {
    std::cout << "update" << std::endl;
}

void pdelete(int id, int args_size, ...) {
    std::cout << "delete" << std::endl;
}

/** 可以限制某类相同函数的操作类型,用于函数流程控制 */
FUNC_t funcs[] = {
    &pcreate,
    &pread,
    &pupdate,
    &pdelete,
};

void args(int args_size/** 可变参数长度 */, ... /** 可变参数*/) {
    va_list argp;
    va_start(argp, args_size);
    for (int i = 0; i < args_size; i++) {
        char* arg = va_arg(argp, char*);
        std::cout << arg;
    }
    std::cout << std::endl;
    va_end(argp);
}

/*
 * 
 */
int main(void) {
    args(2, "Hello ", "World!");

    void (*function_args)(int, ...) = &args;
    function_args(3, "Fuck ", "FFFKKK ", "尼玛");


    std::cout << "---------------------------" << std::endl;
    int funcs_size = sizeof (funcs) / 4;
    for (int i = 0; i < funcs_size; i++) {
        funcs[i](10001, 0); // 调用函数
    }

    std::cout << "---------------------------" << std::endl;

    printf("funcs[0] = %d\tpcreate = %d\n", funcs[0], pcreate);

    
    std::cout << "通过函数指针地址值(int)转换为函数并调用" << std::endl;
    
    int p_adr = int(funcs[0]);
    std::cout << "p_adr = " << p_adr << std::endl;
    FUNC_t f = FUNC_t(p_adr);
    f(2001,0);
    return 0;
}

Hello World!
Fuck FFFKKK 尼玛
---------------------------
create
read
update
delete
---------------------------
funcs[0] = 134514602    pcreate = 134514602
通过函数指针地址值(int)转换为函数并调用
p_adr = 134514602
create
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值