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

标签 c macros

我有一个 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/

相关文章:

c - 我的解决方案是否因文件大小和存储值而导致打印错误?

c++ - 带符号的 16 位 SSE 平均值

c++ - 宏未在此范围内声明

c - fork 和 execve 的问题

c - 如何在C中快速创建大文件?

python - 通过套接字传输大文件

scala - 根据类型参数生成函数

c - 函数类似于 C 中的宏

c - 如何在不修改头文件的情况下取消应用程序代码中的宏定义?

RuSTLang : Adding a return statement in a macro