我无意中编译了一个与此类似的源:
//void y(); //optionally declaring y()
void x()
{
//some code...
void y();
//some code...
}
//void y() {/*some code*/} //optionally defining y()
这是用 VS 2017 和两个 clang 版本编译的。这些编译器都没有抱怨这个源代码——没有错误,没有警告。我的代码中有一个拼写错误——在这个例子中,不应该有void
在...前面y()
因此y()
应该被调用,所以这是一个相当隐蔽的错误,在编译时没有明显的后果。
我很好奇编译器在想什么。尝试调试代码,void y();
里面的线x()
无法访问,因此似乎没有生成实际的机器代码。我用这个测试了void y() {/*somecode*/}
上面声明并下面定义的函数x()
也没有这样的功能——没有区别。
编译器是否认为这是一个声明?如果是这样,在 C++ 中不允许以这种方式(不是谈论 lambda)在函数内定义函数时,如何进一步使用 this ?我假设,如果这样的声明在函数内部有效,那么如果想在函数内部定义函数,那么这将是最有意义的x()
以及,否则声明y()
可以移到外面和上面x()
.
编辑:相关讨论和解释:
- 函数内部的函数声明——为什么? https://stackoverflow.com/questions/29746768/function-declaration-inside-of-function-why
- 语法歧义——最令人烦恼的解析 https://en.wikipedia.org/wiki/Most_vexing_parse
我很好奇编译器在想什么。
它认为您通过名称声明了一个函数y
返回void
并且有一个空的参数列表。void y();
是一个函数声明。
编译器是否认为这是一个声明?
Yes.
如果是这样,当 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)