来自 C17 标准草案(6.3.2.1 ¶4;删除脚注):
A 函数指示符 是具有函数类型的表达式。除非它是
运算符或一元sizeof
运算符的操作数,否则类型为“函数返回type”的函数指示符将转换为类型为“指向函数返回type的指针”的表达式.&
sizeof f
(对于功能指示符f
)是不符合标准的。_Alignof
运算符。typeof
运算符。结果(这里:
f
是函数指示符;fp
是函数指针):
&f
(显式)或f
(短)。(&f)(args)
或f(args)
fp(args)
或(*fp)(args)
这里,
(&f)(args)
/fp(args)
与技术上对函数指针操作的函数调用一致,并且f(args)
/(*fp)(args)
与函数调用对函数(而不是指向函数的指针)进行操作的天真假设一致。风格上,
&f
as "always redundant",(&f)(args)
在实践中几乎没有使用,并且f
/f(args)
/fp(args)
是最短的样式。(为了完整起见(以防其他人想要一个很好的总结),这里有一个更长的等价于
f
的表达式列表:(&f)
,(*******f)
,(***&***f)
,(***&**&f)
, (&**&***f)
, (&**&**&f)
.)
但是:
什么时候有必要或有意义
&f
(其中 f
是函数指示符)或*fp
(其中fp
是一个函数指针)?(所谓“有意义”,我的意思是程序的行为发生了改变。)
sizeof &f
。 (sizeof f
是非法的,即使 GCC 允许它,但具有不同的语义:它似乎在所有(?)情况下都返回 1
。为什么?)
f
自动转换为 &f
可以让我们简化标准的措辞并给 sizeof f
有用的语义。 (也许这个限制的存在是为了保持与typeof
的并行性,它作为编译器扩展已经存在了一段时间。)_Alignof
发生了什么。typeof
随着下一个标准被正式加入C,那么typeof &f
/typeof fp
和typeof f
/typeof *fp
之间的区别显然是有意义的。