C関数、関数ポインタ、関数タイプ、関数配列、関数強制変換使用

2510 ワード

/* 
 * 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
", 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