我打算调用私有类成员函数,但是通过复制和粘贴错误粘贴该行,因为此函数在头文件中声明:
void DebugView::on_cbYAxisEnabled_stateChanged(int)
{
void updateAxisEnabled();
}
而不是
void DebugView::on_cbYAxisEnabled_stateChanged(int)
{
updateAxisEnabled();
}
令人惊讶的是,代码已编译并执行。但是,方法updateAxisEnabled()
未执行。
那么,为什么要编译?这里是一个在方法体内声明的局部函数,或者void
指示编译器忽略后来发生的任何事情?
编译器是Visual Studio 2008。
P.S。:我知道函数中的类声明/定义,但不知道C ++中函数内的函数。
答案 0 :(得分:37)
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!");
}
答案 1 :(得分:5)
完全允许在函数范围内声明函数:可以在任何范围内声明函数。
C ++程序员的一个常见错误确实是:
void foo()
{
MyObject bar(); // 1
bar.someMethod(); // 2
}
这将无法编译,因为第1行不声明MyObject
名为bar
并明确调用其构造函数;相反,它声明一个名为bar
的函数,它返回MyObject
。因此,实际上没有任何对象可以调用someMethod
。