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

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

см. код ниже, я определяю функцию в другой функции,

void test1(void)
{
 void test2(void)
 {
   printf("test2\n");
 }
 printf("test1\n");
}

int main(void)
{
 test1();
 return 0;
}

это использование нечетное, это использование c89/c99 или только расширение gcc (я использовал gcc 4.6.3 в компиляции ubuntu 12). Я запускаю этот код, и он выводит "test2" и "test1".test2 может быть вызван только в test1.

Что еще, какая общая сцена этого использования или для чего используется это использование?

4b9b3361

Ответ 1

Да, это расширение GCC.

Это не C, это не переносимо, и поэтому не очень рекомендуется, если вы не знаете, что GCC будет

  • Будьте единственным компилятором, используемым для создания кода
  • Будет поддерживать эту функцию в будущих версиях
  • Не волнует принцип наименьшего удивления.

Ответ 2

Как написано, это не легальный С++. Вы можете, однако, определить класс внутри функции и определить функции в этом классе. Но даже тогда, в pre С++ 11, это все еще только лексическое гнездование; класс, который вы определяете, не "захватывает" какой-либо контекст внешняя функция (если вы не реализуете захват явно); в настоящей вложенной функции вложенная функция может доступ к локальным переменным во внешней функции. В С++ 11 вы может определять лямбда-функцию с автоматическим захватом.

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

Ответ 4

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

#include<stdio.h>
typedef void (*fptr)(void);
fptr test1(void) {
    void test2(void) {
        printf("test2\n");
    }
printf("test1\n");
return test2;
}
int main(void) {
    void (*f)(void);
    f = test1();
    f();
    return 0;
 }