您可以[非常接近地]使用宏在 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
标题的实现文件中也是如此。
后一种方法具有生成可调试代码的额外好处。即,您可以在调试器中单步执行它,就像它通常与 C++ 模板一起使用一样。