在C中将两个函数连接成一个

时间:2016-10-01 22:14:47

标签: c function concatenation

如何连接(或合并)两个不带参数的函数并且不返回任何函数?在JavaScript中,我会这样做:

function f1() {
    console.log("f1 called");
}
function f2() {
    console.log("f2 called");
}
function function_concat(fa, fb) {
    var final = function() {
        fa();
        fb();
    };
    return final;
}
var merged = function_concat(fa, fb);
merged();

在C中,这就是我所拥有的:

#include <stdio.h>
#include <stdlib.h>

typedef void (*fptr)(void);
void f1() {
    printf("f1 called");
}
void f2() {
    printf("f2 called");
}

fptr function_concat(fa, fb) {
    // What to do here??
}
int main(int argc, const char **argv) {
    fptr merged = function_concat(f1, f2);
    fptr();
}

我知道我必须返回一个静态指针,但是我无法在C函数中定义一个函数,如果我已经在一个函数中,很难创建新函数。有人知道这样做的方法吗?

3 个答案:

答案 0 :(得分:3)

您无法在C中定义运行时的功能,因此您只能选择实现某种代理。您可以使用全局变量来引用函数指针,但是为了给出一个隐式答案,您无法在C中真正模拟它。

如果您需要更改fa_fb_的界面,则需要再次调用function_concat,或者直接设置全局变量,但此时您需要不需要代理功能。

static fptr fa_, fb_;

void function_concat_proxy() {
    fa_();
    fb_();
}

fptr function_concat(fptr fa, fptr fb) {
    fa_ = fp;
    fb_ = fb;
    return function_concat_proxy;
}

答案 1 :(得分:1)

让我先说一下,试图模仿一种将功能视为一等公民的语言的行为,至少可以说是一种奇怪的要求。

或者,有一件事你可以为一个带有两个函数指针然后调用它的类型创建一个新的typedef

typedef void (*mptr)(fptr, fptr);

function_concat看起来像:

void function_concat(fptr fa, fptr fb) {
    fa();
    fb();
}

main

int main(int argc, const char **argv) {
    mptr merged = function_concat;
    merged(f1, f2);
}

这类似于现在仅通过函数指针调用function_concat(f1, f2)。显然不完全是你想要的,但是,唉,我会留在这里作为参考。

答案 2 :(得分:0)

你不能在c中这样做。你可以做的是在function_concat中调用你的2个函数:

void function_concat(fa, fb) {
    fa();
    fb();
}