您可以[非常接近地]使用宏在 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++ 模板一样。