何时有必要或有意义地为函数 f 编写 &f 或为函数指针 fp 编写 *fp(除了:sizeof &f)?

问题描述 投票:0回答:0

来自 C17 标准草案(6.3.2.1 ¶4;删除脚注):

A 函数指示符 是具有函数类型的表达式。除非它是

sizeof
运算符或一元
&
运算符的操作数,否则类型为“函数返回type”的函数指示符将转换为类型为“指向函数返回type的指针”的表达式.

  • 根据我从上面的引用中省略的脚注,
    sizeof f
    (对于功能指示符
    f
    )是不符合标准的。
  • 请注意,C11 标准还提到了
    _Alignof
    运算符。
  • 请注意,C2x 草案还提到了
    typeof
    运算符。

结果(这里:

f
是函数指示符;
fp
是函数指针):

  1. 可以将函数的地址表示为
    &f
    (显式)或
    f
    (短)。
  2. 可以这样调用函数:
    • (&f)(args)
      f(args)
    • fp(args)
      (*fp)(args)

这里,

  • left-hand
    (&f)(args)
    /
    fp(args)
    与技术上对函数指针操作的函数调用一致,并且
  • right-hand
    f(args)
    /
    (*fp)(args)
    与函数调用对函数(而不是指向函数的指针)进行操作的天真假设一致。

风格上,

  • this answer labels
    &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
    之间的区别显然是有意义的。
c language-lawyer function-pointers
© www.soinside.com 2019 - 2024. All rights reserved.