动态确定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++ 中成为语言特性;这将避免您必须重新发明它们并重新实现它们,但您需要学习另一种语言。
在 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++ 中成为语言特性;这将避免您必须重新发明它们并重新实现它们,但您需要学习另一种语言。