为什么另一个函数中的函数声明会编译,它有什么作用?
Why does a function declaration within another function compile and what does it do?
我打算调用私有 class 成员函数,但由于复制和粘贴错误而粘贴了该行,因为该函数在头文件中声明:
void DebugView::on_cbYAxisEnabled_stateChanged(int)
{
void updateAxisEnabled();
}
而不是
void DebugView::on_cbYAxisEnabled_stateChanged(int)
{
updateAxisEnabled();
}
令人惊讶的是,代码被编译并执行了。但是方法 updateAxisEnabled()
没有被执行。
那么,为什么要编译呢?这里是在方法体内声明的局部函数还是 void
指示编译器忽略之后发生的任何事情?
编译器是 Visual Studio 2008。
P.S.: 我知道函数内有 class declaration/definition,但 C++ 中的函数内没有函数。
void updateAxisEnabled();
是函数声明.
样本:
#include <cstdio>
void a();
void b();
int main(void) {
a();
b();
return 0;
}
void a() {
void c(); // Declaration
c(); // Call it
}
void b() {
c(); // Error: not declared
}
void c() {
puts("Hello, world!");
}
完全允许在函数范围内声明函数:可以在任何范围内声明函数。
C++ 程序员的一个常见错误确实是:
void foo()
{
MyObject bar(); // 1
bar.someMethod(); // 2
}
这将无法编译,因为第 1 行 不是 声明一个名为 bar
的 MyObject
并显式调用其构造函数;相反,它声明了一个名为 bar
的 函数 ,returns 为 MyObject
。因此,确实没有对象可以调用someMethod
。
我打算调用私有 class 成员函数,但由于复制和粘贴错误而粘贴了该行,因为该函数在头文件中声明:
void DebugView::on_cbYAxisEnabled_stateChanged(int)
{
void updateAxisEnabled();
}
而不是
void DebugView::on_cbYAxisEnabled_stateChanged(int)
{
updateAxisEnabled();
}
令人惊讶的是,代码被编译并执行了。但是方法 updateAxisEnabled()
没有被执行。
那么,为什么要编译呢?这里是在方法体内声明的局部函数还是 void
指示编译器忽略之后发生的任何事情?
编译器是 Visual Studio 2008。
P.S.: 我知道函数内有 class declaration/definition,但 C++ 中的函数内没有函数。
void updateAxisEnabled();
是函数声明.
样本:
#include <cstdio>
void a();
void b();
int main(void) {
a();
b();
return 0;
}
void a() {
void c(); // Declaration
c(); // Call it
}
void b() {
c(); // Error: not declared
}
void c() {
puts("Hello, world!");
}
完全允许在函数范围内声明函数:可以在任何范围内声明函数。
C++ 程序员的一个常见错误确实是:
void foo()
{
MyObject bar(); // 1
bar.someMethod(); // 2
}
这将无法编译,因为第 1 行 不是 声明一个名为 bar
的 MyObject
并显式调用其构造函数;相反,它声明了一个名为 bar
的 函数 ,returns 为 MyObject
。因此,确实没有对象可以调用someMethod
。