为什么另一个函数中的函数声明会编译,它会做什么?

时间:2015-10-13 12:29:36

标签: c++ visual-c++

我打算调用私有类成员函数,但是通过复制和粘贴错误粘贴该行,因为此函数在头文件中声明:

void DebugView::on_cbYAxisEnabled_stateChanged(int)
{
    void updateAxisEnabled();
}

而不是

void DebugView::on_cbYAxisEnabled_stateChanged(int)
{
    updateAxisEnabled();
}

令人惊讶的是,代码已编译并执行。但是,方法updateAxisEnabled()未执行。

那么,为什么要编译?这里是一个在方法体内声明的局部函数,或者void指示编译器忽略后来发生的任何事情?

编译器是Visual Studio 2008。

P.S。:我知道函数中的类声明/定义,但不知道C ++中函数内的函数。

2 个答案:

答案 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