我有一个C程序,我需要在其中创建一整套具有相同签名和正文的函数,并且只在它们的类型上有所不同。我想要做的是定义一个为我生成所有这些函数的宏,否则我将花费很长时间来复制和修改原始函数。例如,我需要生成的一个函数如下所示:
int copy_key__sint_(void *key, void **args, int argc, void **out {
if ((*out = malloc(sizeof(int))) {
return 1;
}
**((_int_ **) out) = *((_int_ *) key);
return 0;
**((_int_ **) out) = *((_int_ *) key);
return 0;
我的想法是我可以调用一个宏,GENERATE_FUNCTIONS(“int”,“sint”)或类似的东西,让它生成这个函数。斜体部分是需要插入的部分。
这可能吗?
答案 0 :(得分:2)
尝试这样的事情(我刚刚测试了编译,但没有测试执行程序中的结果):
#include "memory.h"
#define COPY_KEY(type, name) \
type name(void *key, void **args, int argc, void **out) { \
if (*out = malloc(sizeof(type))) { \
return 1; \
} \
**((type **) out) = *((type *) key); \
return 0; \
} \
COPY_KEY(int, copy_key_sint)
有关C语言中泛型编程主题的更多信息,请阅读this blog wich contains a few examples以及this book which contains interesting solutions to the problem for basic data structures and algorithm.
答案 1 :(得分:2)
我不理解你给出的示例函数,但是使用宏来完成任务相对容易。只是你不会给宏提供字符串作为参数,但标记:
#define DECLARE_MY_COPY_FUNCTION(TYPE, SUFFIX) \
int copy_function_ ## SUFFIX(unsigned count, TYPE* arg)
#define DEFINE_MY_COPY_FUNCTION(TYPE, SUFFIX) \
int copy_function_ ## SUFFIX(unsigned count, TYPE* arg) { \
/* do something with TYPE */ \
return whatever; \
}
然后,您可以使用它来声明头文件中的函数
DECLARE_MY_COPY_FUNCTION(unsigned, toto);
DECLARE_MY_COPY_FUNCTION(double, hui);
并在.c文件中定义它们:
DEFINE_MY_COPY_FUNCTION(unsigned, toto);
DEFINE_MY_COPY_FUNCTION(double, hui);
在这个版本中,您可能会收到多余的“;”的警告。但你可以通过在像这样的宏中添加虚拟声明来摆脱它们
#define DEFINE_MY_COPY_FUNCTION(TYPE, SUFFIX) \
int copy_function_ ## SUFFIX(unsigned count, TYPE* arg) { \
/* do something with TYPE */ \
return whatever; \
} \
enum { dummy_enum_for_copy_function_ ## SUFFIX }
答案 2 :(得分:1)
那应该有用。要创建copy_key_sint
,请使用copy_key_ ## sint
。
如果你不能使用CPP,那就写一个生成C源文件的小型C程序。
答案 3 :(得分:0)
使用sizeof(*key)
并调用使用memcpy
的单个函数的宏不会比为每种类型创建一个新函数更清洁(更少的预处理程序滥用和代码膨胀)它可以进行原生分配,而不是memcpy
?
我的观点是,整个问题是你尝试将C ++思维应用于C.C有memcpy
这是有充分理由的。