动态确定C中函数参数的类型?

Dynamically determine the type of a function parameter in C?

在 JavaScript 中,我可以使用带有无类型参数的函数,然后根据类型自定义行为:

function customize(a) {
  if (a instanceof Uint8Array) {
    doArray()
  } else if (typeof a == 'function') {
    doFunction()
  } else {
    doOther()
  }
}

我如何在 C 中做同样的事情,无论是否使用宏(最好不使用宏)。

void
customize(void *a) {
  // ???
}

Here 它说:

Your void pointer looses all its type information, so by that alone, you cannot check if it can be cast safely. It's up to the programmer to know if a void* can be cast safely to a type.

我能否以某种方式与我的应用程序中的关键函数或结构进行比较,看看它们是否匹配?

void
customize(void *a) {
  if (a == fn_a) return do_function();
  if (a == fn_b) return do_function();
  // somehow iterate dynamically through the functions.
}

void
fn_a() {

}

正如您发现的帖子中所述,无法通过 void *

你可以用联合做一些类似的事情,但它不是很灵活,我不确定它是一个好的解决方案(对于每种类型都有单独的函数可能更好):

typedef enum {
    TYPE_1 = 0,
    TYPE_2,
    TYPE_3
} type_e;

typedef union {
    int     t1;
    char    t2[5];
    double  t3;
} types_u;

typedef struct {
    type_e type;
    types_u types;
} my_types_t;


void func(my_types_t *some_variable)
{
    switch (some_variable->type)
    {
        case TYPE_1:
            // do something 
            break;
        case TYPE_2:
            // do something else
            break;
    }

}

有句老话,你可以用任何语言编写 FORTRAN。我不确定这是不是真的,但我敢肯定你不能用任何语言编写 Javascript,尤其是不能用 C.

C 是静态类型的,所有类型信息在运行时都会丢失。您将不得不重新考虑您的设计,也许完全避免携带信息的需要,也许传递一个带有该信息的附加参数,也许将它与结构中的 void* 捆绑在一起,也许假设 void* 指向你有更多信息的东西,你可以重新提取类型信息。有几种可能的技术,都有各种权衡和注意事项,但扩展它们就像写一本书,我没有时间写。

一些技术在 C++ 中成为语言特性;这将避免您必须重新发明它们并重新实现它们,但您需要学习另一种语言。