- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在嵌入式微 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_long
和 Write_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/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!