【问题标题】:C++: declaration of a function inside another function is not a compiler error so... what is it?C++:在另一个函数中声明一个函数不是编译器错误,所以......它是什么?
【发布时间】:2019-07-21 01:32:28
【问题描述】:

无意中编译了一个类似这样的源码:

//void y(); //optionally declaring y()

void x()
{
  //some code...
  void y();
  //some code...
}

//void y() {/*some code*/} //optionally defining y()

这是用 VS 2017 和两个 clang 版本编译的。这些编译器都没有抱怨这个源代码——没有错误,没有警告。我的代码中有一个错字——在这个例子中,y() 前面不应该有void,因此应该调用y(),所以这是一个相当隐蔽的错误,在编译时没有明显的后果。

我很好奇编译器在想什么。尝试调试代码时,x() 中的 void y(); 行无法访问,因此似乎没有生成实际的机器代码。我用上面声明的void y() {/*somecode*/} 函数和下面定义的x() 进行了测试,也没有这样的函数——没有区别。

编译器是否认为这是一个声明?如果是这样,在 C++ 中不允许以这种方式(不是说 lambdas)在函数中定义函数时如何进一步使用它?我假设如果这样的声明在函数内部是有效的,那么如果想要在x() 内部定义一个函数,这将是最有意义的,否则y() 的声明可以移到x() 的外部和上方。

编辑:相关讨论和解释:

【问题讨论】:

  • 这只是一个函数原型,声明y 是一个不带参数也不返回值的函数。将一个放在函数中很奇怪,但完全合法。多亏了像 lambdas 这样的东西,你可以有嵌套的函数定义......
  • "编译器是否认为这是一个声明?"是的。仅此而已,仅此而已。除非您调用它,否则不会生成任何代码。
  • @doug 评论的扩展:然后你最好在某处定义函数,否则链接器会非常混乱。
  • 我知道 lambda,但这不相关,它们需要不同的语法。 @Shawn:如果这是一个函数原型,如何进一步使用它?在道格:我怎么称呼它?可以叫什么?
  • 你会像其他函数一样调用它吗? y();.

标签: c++ c function syntax


【解决方案1】:

我很好奇编译器在想什么。

它认为您声明了一个名为 y 的函数,该函数返回 void 并有一个空参数列表。 void y(); 是一个函数声明。

编译器是否认为这是一个声明?

是的。

如果是这样,当 C++ 中不允许嵌套函数时,如何进一步使用它?

您可以使用函数声明来调用它,或者获取它的地址。像这样:

void x()
{
    void y(); // a function declaration

    // now that y has been declared, it can be called:
    y();      // a function call

    // also, it is now possible to take the address:
    void (*fun_ptr)() = y;
}

【讨论】:

  • 确实,谢谢,这很少使用,以至于在我看来它看起来很尴尬,而且我看不到这种语法的用例或一些优点(通常在 y() 之外声明x(),或在首先包含的头文件中)。我的想法是:如果你坚持在另一个函数中声明一个函数,你肯定也想在里面定义这个新函数!
猜你喜欢
  • 2016-09-28
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 2021-05-30
  • 2016-12-15
相关资源
最近更新 更多