Почему декларация функции внутри другой функции компилируется и что она делает?
Я намеревался вызвать функцию члена частного класса, но по ошибке копирования и вставки вставил строку, поскольку эта функция объявлена в заголовочном файле:
void DebugView::on_cbYAxisEnabled_stateChanged(int)
{
void updateAxisEnabled();
}
вместо
void DebugView::on_cbYAxisEnabled_stateChanged(int)
{
updateAxisEnabled();
}
Удивительно, что код был скомпилирован и выполнен. Однако метод updateAxisEnabled()
не был выполнен.
Итак, зачем он компилируется? Была ли здесь локальная функция, объявленная внутри тела метода или имела void
, инструктировала компилятор игнорировать все, что приходит после этого?
Компилятор - это Visual Studio 2008.
P.S.: Я знаю объявление/определение класса внутри функций, но не функции внутри функций в С++.
Ответы
Ответ 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.