如何在C中使用接口的不同实现?

k5ifujac  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(113)

我想用C实现一个可微函数。本质上,它是一个有两个函数指针的结构体。一个用来计算函数值,另一个用来计算它的微分。结构在头文件中声明。理想情况下,我的应用程序应该只知道这个接口:对象是一个带有两个函数指针的结构体,这些函数将一个double转换为另一个double
问题是我不知道如何正确地为我的程序提供这个接口的一个实现(或多个实现)。我有五个可微函数,我需要在运行时在它们之间切换。我也可以决定在未来使用更多或更少的。在Java中,我只需要import接口及其实现(可能是整个包),它将确保类型安全,未使用的导入不会影响性能。但是在C语言中我不能只包含我想要的东西,因为它会被复制到程序中。我也不想在我的Makefile中更改编译命令,因为它没有显式地反映在我的代码中。
内存使用和性能并不像可读性和模块化那么重要。我并不坚持我的方法是基本正确的,我愿意改变它。在C语言中有没有一种传统的方法来解决这样的问题?

mo49yndu

mo49yndu1#

本质上,它是一个有两个函数指针的结构体。一个用来计算函数值,另一个用来计算它的微分。

struct Function { double (*f)(double), (*df)(double); };

字符串
问题是我不知道如何正确地为我的程序提供这个接口的一个实现(或多个实现)。

struct Function Sine = { sin, cos };


演示:

struct Function { double (*f)(double), (*df)(double); };

#include <math.h>
#include <stdio.h>

struct Function Sine = { sin, cos };

static void Demonstrate(struct Function F, double x)
{
    printf("f(%g) = %g.\n", x, F.f(x));
    printf("df(%g) = %g.\n", x, F.df(x));
}

int main(void)
{
    Demonstrate(Sine, 3.1415926535897932384626433/6);
}

相关问题