分配函数指针正确的方法(correct way to assign function pointer

2019-07-21 04:42发布

我有点困惑的正确语法分配函数指针的变量。 如果我有一个函数foo

int foo();

而我分配一个指针到foo变量酒吧

void * bar;

它似乎没有,如果我使用到物质

bar = foo; 
// or 
bar = &foo; 

在我看来,只有其中之一应该是正确的还是我失去了一些东西?

Answer 1:

foo&foo值在C等效并且具有相同的类型。

&此操作是正确的,但多余的。

需要注意的是分配函数指针为void *是无效的C.

void *fp1 = foo;   // invalid
int (*fp2)() = foo;  // valid
int (*fp3)() = &foo; // valid

(这实际上是声明,但赋值运算符的限制适用。)



Answer 2:

让我解释一点。

foo和&FOO值在C等效并且具有相同的类型。

由评论由@ouah答案指出这是不完全正确。 尤其:

  1. sizeof(foo)是无效的,和sizeof(&foo)是一个指针的大小。
  2. &foo是指针为foo,而&(&foo)是无效的。

但是,它们实际上是在所有的其它情况下是相同的,如由C(参照,例如,的标准中提到C11的草案 ):

6.3.2.1.4:一个功能标志是具有功能类型的表达式。 除了当它是sizeof运算符的操作数或一元&操作, 功能指示器,类型为“函数返回类型”被转换成具有输入“指针函数返回类型”的表达式

所述sizeof和一元&运营商是唯一的两个例外当一个函数指示符不被转换为指针。

PS你也能找到原因sizeof(foo)&(&foo)是无效的:

6.5.3.2.1:一元的操作数&操作者应是一个功能指示器,一个的结果[]或一元*操作员或该指定的一个对象,该对象是不是一个位域和不与声明的左值寄存器存储类SPECI网络呃。

6.5.3.4.1所述sizeof操作者不得应用于具有函数类型或不完整的类型的表达式,这种类型的括号名称,或者,它指定待比特音响场构件的表达式。



文章来源: correct way to assign function pointer