Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 函数指针表的无操作设备?_C_Lookup - Fatal编程技术网

C 函数指针表的无操作设备?

C 函数指针表的无操作设备?,c,lookup,C,Lookup,我目前正在使用它在函数指针表中定义一个零,其中输入索引应该什么都不做。这可以吗?还是有什么明显的错误?虽然一般来说,no op本身没有问题,但这被称为Null对象模式,我会担心函数声明——也就是说,表中的每个函数是否都接受0个参数并返回void 一个反例是OpenGL,您经常检索指向函数的指针并将其强制转换为所需的类型—但将void->void指针强制转换为其他类型,例如int、int->int将是未定义的行为,可能会导致崩溃或未初始化的返回值,或者其他 因此,如果表中的函数是同构的,那么就使用

我目前正在使用它在函数指针表中定义一个零,其中输入索引应该什么都不做。这可以吗?还是有什么明显的错误?

虽然一般来说,no op本身没有问题,但这被称为Null对象模式,我会担心函数声明——也就是说,表中的每个函数是否都接受0个参数并返回void

一个反例是OpenGL,您经常检索指向函数的指针并将其强制转换为所需的类型—但将void->void指针强制转换为其他类型,例如int、int->int将是未定义的行为,可能会导致崩溃或未初始化的返回值,或者其他

因此,如果表中的函数是同构的,那么就使用它。如果没有,最好做点别的

编辑:你只能用一个函数指针做两件事——将它转换成另一个函数指针;和调用,但仅使用原始类型

有关详细信息,请参阅。陈雷蒙在这里有另一个例子-


EDIT2:但是,你可以做一些不操作noop\u IntInt,noop\u IntDouble\u Double等等。。。然后,如果您每次都匹配类型,这可能会起作用,而一般来说,no op本身没有问题,这称为Null对象模式,我会担心函数声明,即表中的每个函数是否都接受0个参数并返回void

一个反例是OpenGL,您经常检索指向函数的指针并将其强制转换为所需的类型—但将void->void指针强制转换为其他类型,例如int、int->int将是未定义的行为,可能会导致崩溃或未初始化的返回值,或者其他

因此,如果表中的函数是同构的,那么就使用它。如果没有,最好做点别的

编辑:你只能用一个函数指针做两件事——将它转换成另一个函数指针;和调用,但仅使用原始类型

有关详细信息,请参阅。陈雷蒙在这里有另一个例子-


EDIT2:但是,你可以做一些不操作noop\u IntInt,noop\u IntDouble\u Double等等。。。然后,如果您每次都匹配类型,这可能会起作用

您的假设是正确的,那么表中的其他函数将采用多个参数。我可以向这个函数添加相同的参数,使其同质化。我可以混合返回类型吗?我是这样宣布这张桌子的:你的评论似乎被打破了;你能把表格声明粘贴到别的地方吗?github、pastebin等虽然可以在表中存储不同类型的函数指针,但不能使用其他类型调用它们。有关更多详细信息,请参阅。是的,编译器已经警告过我:但原始问题仍然存在!如果你足够小心的话,你可以为每一种类型组合做一个noop。这应该行得通。不过看起来很可怕。对于代码生成器来说,这是一项很好的任务,而不是人类;您的假设是正确的,表中的其他函数采用多个参数。我可以向这个函数添加相同的参数,使其同质化。我可以混合返回类型吗?我是这样宣布这张桌子的:你的评论似乎被打破了;你能把表格声明粘贴到别的地方吗?github、pastebin等虽然可以在表中存储不同类型的函数指针,但不能使用其他类型调用它们。有关更多详细信息,请参阅。是的,编译器已经警告过我:但原始问题仍然存在!如果你足够小心的话,你可以为每一种类型组合做一个noop。这应该行得通。不过看起来很可怕。对于代码生成器来说,这是一项很好的任务,而不是人类;
void table_no_op()
{
// this is for function table elements that do nothing,
// fills space between states, use less of them
    return;
}