【问题标题】:Are Parameter Names Allowed in Function Pointer Deffinitions函数指针定义中是否允许使用参数名称
【发布时间】:2018-06-22 18:18:03
【问题描述】:

所以我刚刚看到了一个使用命名参数的函数指针声明示例:

int (*func)(int a, int b) = &foo;

我假设这是定义明确的代码,因为它可以编译并运行良好:https://ideone.com/C4mhsI

但我以前从未见过这种情况(可能是因为它增加了已经难以解析的函数指针的复杂性。)尽管如此,我希望看到一个声明,说明这是合法的,而不是一些疯狂的 gcc 扩展。有人能帮我找点什么吗?

【问题讨论】:

  • @downvoter 否决票有什么特别的原因吗?或者这只是对 C++ 问题的强制投票?

标签: c++ parameters language-lawyer function-pointers named-parameters


【解决方案1】:

就像你可以在函数声明中指定参数名称一样: int funct(int a, int b); 你也可以在函数指针中 int (*func)(int a, int b)。在这两种情况下,名称都没有任何作用,实际上它们被用作文档辅助,以便于阅读。

【讨论】:

  • 注意:这个问题被标记为language-lawyer
  • 您在问题的标题中意识到我称这些“命名参数”对吗?当我问这个问题时,我知道它们是什么,因此我没有问:“这些是什么?”我问:“在函数指针定义中命名参数是否合法?”你没有试图回答这个问题。请纠正此问题或删除此答案。
  • 以这种方式声明一个函数是有效的,并在声明前放置一个*使其成为一个指针。所以用语法指向函数的指针也是有效的。
  • @mdatsev 好吗?对于它的价值,我也怀疑它是合法的。不幸的是,我们的意见没有问题中提出的 gcc 编译器的意见那么重要。我正在寻找一个可以确认 gcc 立场的答案。理想情况下比我们的意见更多。
【解决方案2】:

您可以遵循 declarator 的语法,这是一个没有任何类型或 decl 说明符的声明。

declarator:
  ptr-declarator
  [...]

ptr-declarator:
  noptr-declarator
  ptr-operator ptr-declarator

noptr-declarator:
  [...]
  noptr-declarator parameters-and-qualifiers
  ( ptr-declarator )

parameters-and-qualifiers:
  ( parameter-declaration-clause ) [...]

ptr-operator:
  * attribute-specifier-seq[opt] cv-qualifier-seq[opt]
  [...]

我删除了所有不需要的语法规则,以便能够更轻松地遵循它。我不会这样做,因为写下来有点痛苦,但最后你会发现你有代表参数的parameters-and-qualifiers

如果你为一个函数这样做,你会看到它也以 parameters-and-qualifiers 结尾。它们使用相同的语法,[decl.ptr] 下的标准并没有禁止这样做。

【讨论】:

  • 不错,但说实话,生产规则并不是最容易遵循的。
  • @PasserBy 是的,有时它们会很快变得非常复杂。那么你是否希望我为这个例子做这件事?还是可以?
  • 我不确定最好的方法,也许会说生成的声明符的形式为 ( * declarator-id ) ( parameter-declaration, parameter-declaration )parameter-declarationdecl-specifier-seq 后跟 declaratorabstract-declarator 其中没有declartor-id
猜你喜欢
  • 2012-06-22
  • 1970-01-01
  • 2017-02-16
  • 2017-06-30
  • 2011-10-30
  • 2014-10-12
  • 1970-01-01
  • 2016-10-03
  • 2011-11-17
相关资源
最近更新 更多