C 与普通函数调用相比,仍然无法获得回调
我在这里看到了几乎所有流行的回调问题,但仍然不明白为什么在回调中使用函数指针,而不是通过普通函数简单地使用回调。下面是一个流行问题的公认答案(修改)C 与普通函数调用相比,仍然无法获得回调,c,pointers,callback,function-pointers,C,Pointers,Callback,Function Pointers,我在这里看到了几乎所有流行的回调问题,但仍然不明白为什么在回调中使用函数指针,而不是通过普通函数简单地使用回调。下面是一个流行问题的公认答案(修改) void populate_array(int *array, size_t arraySize, int getNextValue(void)) // Note that, here I use normal function call. { for (size_t i=0; i<arraySize; i+
void populate_array(int *array, size_t arraySize,
int getNextValue(void)) // Note that, here I use normal function call.
{
for (size_t i=0; i<arraySize; i++)
array[i] = getNextValue();
}
int getNextRandomValue(void)
{
return rand();
}
int main(void)
{
int myarray[10];
populate_array(myarray, 10, getNextRandomValue);
...
}
void填充数组(int*array,size\t arraySize,
int getNextValue(void))//注意,这里我使用普通函数调用。
{
对于(尺寸i=0;i
这不是函数调用:声明中不能有函数调用。getNextValue
是指向函数的指针,该函数不带任何参数,并返回使用不同语法声明的int
考虑这个类比:您可以为指向int
的指针定义一个新类型,并在函数声明中使用它
typedef int* intptr_t;
void myFunction(intptr_t ptr) {
...
}
或者您可以说,ptr
是指向声明内int
的指针:
void myFunction(int* ptr) {
...
}
同样,在声明中使用函数指针之前,可以先定义它的类型
typedef void generator_t(void);
void populate_array(int *array, size_t arraySize, generator_t getNextValue) {
}
或者,您可以说getNextValue
是一个函数指针,使用您文章中的替代语法
为函数指针使用typedef
的一个原因是,当您想要创建函数指针数组时,一致性检查:如果您的库函数使用在该函数声明中定义的函数指针,则需要在您自己的代码中重新创建相同的声明,以创建您想要的指针数组作为指针传递到库。这可能会导致不一致,这些不一致仅在库函数调用时可见,而不是在数组声明时可见,从而使潜在问题更难跟踪。它们都以相同的方式工作-它们是函数的指针。类似于(在你的main
的上下文中)myarray
和&myarray
都指向同一个东西。@DrewMcGowen差不多了。myarray
和&myarray
没有指向同一个东西。那么,为什么人们更喜欢int(*foo)(void)
,而不是int foo()
@ashish2expert,因为它是1.更明确,2.更接近事实。“注意,这里我使用普通函数调用。”不,它不是普通函数调用!它是一个函数指针,只是使用不同的语法。那么,如果我们可以这样做,为什么要这么做呢above@ashish2expert我应该重复一遍吗?“因为它是1.更显式,2.更接近事实。”@ashish2expert在函数声明外定义了指针类型,这样可以更容易地传递用于在目标库内使用的指针。在声明内不能有函数调用并不完全正确:#include
,void foo(int a[][printf(“Hello,world.\n”)]{}
,intmain(void){foo(0);返回0;}
打印“Hello,world”。@EricPostpischil现在这是邪恶的;-)
typedef void generator_t(void);
void populate_array(int *array, size_t arraySize, generator_t getNextValue) {
}