我有一个 C 程序,我需要在其中创建一整套函数,这些函数具有相同的签名和函数体,只是类型不同。我想做的是定义一个宏来为我生成所有这些函数,否则我将花费很长时间来复制和修改原始函数。例如,我需要生成的函数之一如下所示:
<em>int</em> copy_key__sint_(void *key, void **args, int argc, void **out {<br/>
if ((*out = malloc(sizeof(<em>int</em>))) {<br/>
return 1;<br/>
}
<pre><code>**((_int_ **) out) = *((_int_ *) key);
return 0;
</code></pre>
}
我的想法是我可以调用一个宏,GENERATE_FUNCTIONS("int", "sint") 或类似的东西,并让它生成这个函数。斜体部分是需要插入的部分。
这可能吗?
最佳答案
我不太理解您提供的示例函数,但是使用宏完成任务相对容易。只是您不会将字符串作为参数提供给宏,而是标记:
#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 }
关于宏可以用来模拟 C++ 模板函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3735289/