Что означает вложенная функция в C? - PullRequest
3 голосов
/ 05 августа 2011
void t(){
    printf("hello\n");
    void s(){
        printf("2\n");
    }   
}
int main(){
    t();
    return 0;                                                                                                                                 
}

После того, как я позвоню t(), следует определить s, но, похоже, это не так.

Это просто игнорируется?

Ответы [ 3 ]

6 голосов
/ 05 августа 2011

Хорошо известные языки, поддерживающие лексически вложенные функции, включают :

  • Языки на основе ALGOL, такие как ALGOL 68, Simula, Pascal, Modula-2, Modula-3, Oberon иAda.
  • Современные версии Lisp (с лексической областью действия), такие как Scheme и Common Lisp.
  • Сценарий ECMA (JavaScript и ActionScript).
  • Полная поддержка в Scala
  • Различные степени поддержки в языках сценариев, таких как Ruby, Python и Perl (начиная с версии 6).
  • Существует также язык, связанный с C, с вложенными функциями, язык D.
  • GCC также поддерживает вложенные функции в C как расширение языка. 1
  • Fortran, начиная с Fortran-90, поддерживает один уровень вложенных (CONTAINed) подпрограмм ифункции.

В вашем случае функция s будет доступна только в пределах t.

Вложенная функция - это функция, определенная внутри другой функции.(Вложенные функции не поддерживаются для GNU C ++.) Имя вложенной функции является локальным для блока, в котором она определена.Например, здесь мы определяем вложенную функцию с именем square и вызываем ее дважды:

 foo (double a, double b)
 {
   double square (double z) { return z * z; }

   return square (a) + square (b);
 }

Вложенная функция может получить доступ ко всем переменным содержащейся функции, которые видны в точке ее определения.Это называется лексическим ограничением.Например, здесь мы показываем вложенную функцию, которая использует унаследованную переменную с именем offset:

 bar (int *array, int offset, int size)
 {
   int access (int *array, int index)
     { return array[index + offset]; }
   int i;
   /* ... */
   for (i = 0; i < size; i++)
     /* ... */ access (array, i) /* ... */
 }

Определения вложенных функций разрешены внутри функций в местах, где допускаются определения переменных;то есть в любом блоке смешивается с другими объявлениями и операторами в блоке.

См. «Вложенные функции - Использование коллекции компиляторов GNU (GCC)»

2 голосов
/ 05 августа 2011

На самом деле s будет доступно только в пределах t. Цитирование ссылки, размещенной In silico:

Имя вложенной функции локально для блока , где она определена.

0 голосов
/ 05 августа 2011

В C функции и их область действия (где их имя можно использовать) определяются и исправляются во время компиляции.Если вы хотите изменить то, что делает имя функции во время выполнения, вам нужно использовать указатели функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...