gpt4 book ai didi

c - C中的多态函数参数/返回值

转载 作者:太空宇宙 更新时间:2023-11-04 00:11:46 27 4
gpt4 key购买 nike

我在嵌入式微 Controller 中工作,我必须将多种类型的数据读/写到非 volatile RAM (NVRAM)。我想避免像这样为每个值编写单独的读/写函数以存储在 NVRAM 中:

void Write_Value1(int value);
int Read_Value1(void);
void Write_Value2(unsigned long value);
unsigned long Read_Value2(void);
...

随着要读/写的项目列表的增长,维护起来肯定很麻烦。在 C++ 中有几种方法可以解决这个问题,例如模板。使用模板,我可以编写一个 .Read().Write(T value) 函数,每个要读/写的项目都可以访问这些函数。有没有办法从 C 中获得这种行为?我怀疑有某种方法可以使用 void 指针和 vtables 的某种组合。我想以更加多态的方式处理这个问题,并具有以类似方式调用的将每个项目读/写到 NVRAM 的功能。

最佳答案

您可以[非常接近地]通过使用宏在 C 中模拟 C++ 模板。

至少有两种方法可以做到这一点。


第一种方法:“橡皮图章”宏

为您的函数定义声明/定义宏

#define DECLARE_READ_WRITE(suffix, type)\
type Read_Value_##suffix(void);
void Write_Value_##suffix(type val);

#define DEFINE_READ_WRITE(suffix, type)\
type Read_Value_##suffix(void) {\
/* your code */ \
}\
  void Write_Value_##suffix(type val) {\
/* your code */ \
}

然后在一些头文件中做

DECLARE_READ_WRITE(long, long)
DECLARE_READ_WRITE(int, int)

在一些实现文件中

DEFINE_READ_WRITE(long, long)
DEFINE_READ_WRITE(int, int)

这将为 Read_Value_int “生成”声明和定义, Write_Value_int , Read_value_longWrite_value_long .


第二种方法:参数化包含文件

创建两个头文件。一个用于声明 ( read_write.h.template )

TYPE__ CONCAT(Read_Value_, SUFFIX__)(void);
void CONCAT(Write_Value_, SUFFIX__)(TYPE__ val);

还有一个用于定义 ( read_write.c.template )

TYPE__ CONCAT(Read_Value_, SUFFIX__)(void)
{
/* your code */
}

void CONCAT(Write_Value_, SUFFIX__)(TYPE__ val)
{
/* your code */
}

在这里CONCAT是宏标记连接的常用实现(也可以/应该在第一种方法中使用)。

然后将您的“模板化”代码包含到适当的头文件和实现文件中作为

#define TYPE__ int
#define SUFFIX__ int
#include "read_write.h.template"
#undef TYPE__
#undef SUFFIX__

#define TYPE__ long
#define SUFFIX__ long
#include "read_write.h.template"
#undef TYPE__
#undef SUFFIX__

read_write.c.template 的某些实现文件中的相同内容标题。

后一种方法具有生成可调试代码的额外好处。 IE。您可以在调试器中逐步执行它,就像它通常使用 C++ 模板一样。

关于c - C中的多态函数参数/返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11397856/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com