c语言 - 用于"generic"函数指针的数据类型?



根据本网站上各种问题的答案(链接、链接、链接(,不允许将函数指针转换为数据指针。

这对我来说是有意义的,因为在某些CPU架构中,函数指针比数据指针长:通过将函数指针强制转换为数据指针,数据会丢失。

桌面程序的一个历史性例子是x86-16;中等;存储器布局(sizeof(void (*)())=4sizeof(void *)=2(;您仍然可以在一些现代(主要是非桌面(CPU中找到这种行为。

如果一个变量应保持一个指向"0"的指针;未知";数据,则使用数据类型void *

我目前正在编写一个程序,其中一个变量可能包含指向"0"的指针;未知";函数(就像Linux中dlsym()或Windows中GetProcAddress()返回的值一样(:

// ---- file1.c ----
typedef /* What to use here? */ functionPointer;
...
functionPointer myPointer, myPointer2;
myPointer = getFunction(1);
myPointer2 = getFunction(2);
...
double (*fptr)(double, void *) = myPointer2;
...
// ---- file2.c ----
void func1(void);
double func2(double x, void * y);
functionPointer getFunction(int which)
{
switch(which)
{
case 1: return &func1;
case 2: return &func2;
...
}
}

如果程序应该是独立于平台的,那么在这种情况下会使用哪种数据类型?

如果没有适用于所有平台(台式机、微控制器、DSP、GPU等(的解决方案:

是否有适用于所有台式机的解决方案?

对于通用函数指针,请使用任何函数指针类型。

C 2018 6.3.2.3 8说:

指向一种类型的函数的指针可以转换为指向另一种类型函数的指针,然后再转换回来;结果应与原始指针进行比较…

这意味着您可以将任何函数指针转换为不同类型的函数指针。只要在调用函数时将其转换回原始类型,行为就会被定义,并且它将正确地调用原始函数。

C不提供指定的通用函数指针类型,如对象的void *。你只需要为你的程序选择一个,比如void (*)(),然后使用它。

您包含了"GPU";在平台列表中。有些GPU甚至不支持真正的函数调用,而只支持内联&展开(即在OpenCL中(。与";goto;命令它甚至不允许从功能的另一个入口点进入。

如果可以的话,对函数标识符数组进行排序(提示要调用哪个函数(。然后将不同的块分离成不同的数组,然后在它们自己的内核中调用它们。如果有100个不同的函数,那么在数组排序后,可以在它们自己的内核中调用所有函数。这甚至针对GPU着色器的分支性能问题进行了优化。内核完成后,您可以继续主算法。

最新更新