Подтвердить что ты не робот

Почему декларация функции внутри другой функции компилируется и что она делает?

Я намеревался вызвать функцию члена частного класса, но по ошибке копирования и вставки вставил строку, поскольку эта функция объявлена ​​в заголовочном файле:

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

вместо

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

Удивительно, что код был скомпилирован и выполнен. Однако метод updateAxisEnabled() не был выполнен.

Итак, зачем он компилируется? Была ли здесь локальная функция, объявленная внутри тела метода или имела void, инструктировала компилятор игнорировать все, что приходит после этого?

Компилятор - это Visual Studio 2008.

P.S.: Я знаю объявление/определение класса внутри функций, но не функции внутри функций в С++.

4b9b3361

Ответ 1

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!");
}

Ответ 2

Абсолютно разрешено объявлять функцию внутри области видимости функции: функция может быть объявлена ​​в любой области.

Общей ошибкой среди программистов на C++ действительно является:

void foo()
{
    MyObject bar(); // 1
    bar.someMethod(); // 2
}

это с трудом скомпрометируется, потому что строка 1 не объявляет MyObject с именем bar и явно вызывает свой конструктор; скорее, он объявляет функцию с именем bar, которая возвращает MyObject. Тем не менее, на самом деле нет объекта для вызова someMethod on.