如何在C中创建一个带有未知类型参数的函数?

rid*_*rid 8 c types

说我有以下代码:

struct test* t1;
t1 = get_t(1);
Run Code Online (Sandbox Code Playgroud)

......在哪里get_t:

struct test* get_t(int);
Run Code Online (Sandbox Code Playgroud)

如何重构上面的代码并将其放入函数中?类似于以下内容:

void r1(?* t, ?* (fn*)(int)) {
    t = fn(1);
}

/* ... */

struct test* t1;
r1(t1, &get_t);
Run Code Online (Sandbox Code Playgroud)

Man*_*res 5

use void *param,一个指向任何东西的指针......通常在 glib 中用作gpointer

  • 空指针确实是在 C 中编写完整泛型代码的唯一方法。还应该注意,您真正需要编写此类泛型代码的唯一情况是在设计抽象代码模块时,例如 ADT 和搜索/排序算法。如果您发现自己在任何其他情况下都需要完全通用的代码,您可能应该重新考虑您的程序设计。 (2认同)

pho*_*xis 5

我有两个想法:

[1] 传递void指向变量/对象的指针,并在函数中对其进行类型转换。

[2] 将所有数据类型与一个整数数据类型结合起来,这将标识联合中的哪个数据类型变量确实保存了实际数据。将此联合作为值或作为void *

struct _unknown {
   union {
      int a;
      float b;
      char c;
      double d;
   } data;
   int type;
} unknown;
.
.
.
if (unknown.type == FLOAT)
{
  /* Process variable b */ 
}
else if (unknown.type == INT)
{
 /* Process variable a */
}
.
. 
.
Run Code Online (Sandbox Code Playgroud)

像这样的东西。

您可以散列定义FLOAT,并INT和他人的独特价值。

或者干脆

struct _unknown {
  void *data;
  int type;
} unknown;
.
.
.
if (unknown == FLOAT)
{
  /* process (float *) data */
}
else if (unknown == INT)
{
  /* process (int *) data */
}
else if (unknown == MY_DATA_TYPE)
{
  /* process (my_data_type *) data */
  /* where my_data_type could be a typedef, or struct */
}
Run Code Online (Sandbox Code Playgroud)