Использование объявления функции внутри функции?

Возможный дубликат:
можно ли использовать объявления функций внутри функций?

Я знаю, что внутри функции мы можем объявить функцию. Какая от этого польза? Не могли бы вы привести простой пример?


person Narek    schedule 05.10.2011    source источник
comment
@Р. Мартиньо Фернандес спасибо, я тоже узнал об этом вопросе. Купить кстати это не тот же вопрос. Только название вопроса, которое вы упомянули, совпадает с моим вопросом. Но на самом деле это разные вопросы.   -  person Narek    schedule 05.10.2011
comment
мне кажется тот же вопрос. Даже ответ, который вы выбрали, почти такой же.   -  person R. Martinho Fernandes    schedule 05.10.2011


Ответы (2)


В объявлении функции внутри функции мало смысла, если только вы не собираетесь определять ее позже и делать ее доступной только для этой функции, т. Е. Объявление функции инкапсулировано.

int main() {
    void foo();
    foo();
}
void some_other_func() {
    foo(); // ERROR
}
void foo() {
}

Но это все. По сравнению с запуском Most Vexing Parse, это в лучшем случае крайне ограниченное преимущество.

person Puppy    schedule 05.10.2011
comment
И это нормально для C++! Спасибо за пример. - person Narek; 05.10.2011
comment
Запрет объявления функций внутри функции не решит самую неприятную проблему синтаксического анализа; проблема также возникает, когда вы пытаетесь определить переменную в области пространства имен. И хотя объявление функции внутри другой функции не очень полезно, нет причин запрещать это и уменьшать ортогональность. - person James Kanze; 05.10.2011
comment
Тем не менее, если вы реализовали some_other_func() ПОСЛЕ реализации foo(), у вас был бы доступ к foo(), поэтому инкапсуляция довольно фальшивая. - person xanatos; 05.10.2011
comment
Означает ли это, что нет реального/практического использования объявления функции в другой функции? - person Narek; 05.10.2011
comment
Это деликатный вопрос, и мне нужно и чужое мнение. Я предполагаю, что у него есть реальное использование DeadMG. - person Narek; 05.10.2011

Насколько я знаю, определение функций внутри функций в C/C++ нестандартно, и его поддерживают только некоторые компиляторы. Однако вы можете использовать новую возможность C++, так называемые лямбда-функции.

Определение функций (или лямбда-функций) внутри других функций может быть полезным несколькими способами (в зависимости от реализации):

  1. Вы держите связанный код рядом, его легче читать и понимать.
  2. Внутренние функции могут иметь прямой доступ к переменным внешних функций (следовательно, меньше данных для явной передачи в качестве параметров).
person Alexey Frunze    schedule 05.10.2011
comment
Вы уверены в нестандартности? - person Narek; 05.10.2011
comment
Вопрос в объявлении функций, а не в их определении. определения внутренних функций нестандартны (если не считать лямбда-выражений C++11). объявления функций стандартны. - person Steve Jessop; 05.10.2011
comment
@SteveJessop: Спасибо за разъяснение. Я предположил, что речь идет об определении, потому что оно наиболее полезно здесь, и потому что люди (включая меня) склонны смешивать два термина, и теперь может быть моя очередь смешивать их. :) - person Alexey Frunze; 05.10.2011
comment
@Alex: путанице не помогает тот факт, что каждое определение также является объявлением. Поэтому, когда кто-то говорит, что я объявил эту функцию здесь, и они фактически определили ее, они не ошибаются, и путаница сохраняется... - person Steve Jessop; 05.10.2011