【发布时间】: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();.