可以使用宏来模拟C ++模板函数吗?

时间:2010-09-17 12:28:52

标签: c macros

我有一个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”)或类似的东西,让它生成这个函数。斜体部分是需要插入的部分。

这可能吗?

4 个答案:

答案 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这是有充分理由的。