Определение функции внутри определения другой функции: действительно ли это? - PullRequest
6 голосов
/ 11 ноября 2011

см. Этот код

#include<stdio.h>

int main()
{
    void test(void)
    {
        printf("test");
        return;
    }
printf("main");
return 0;
}

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

РЕДАКТИРОВАТЬ: если да, то есть ли использование этого?

Почему gcc должен добавить эти функции в качестве расширения ... должно быть любое использованиеэто не так?!

Ответы [ 5 ]

6 голосов
/ 11 ноября 2011

Вложение определений функций зависит от расширения GCC для работы.Стандарт не описывается.

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

Я не эксперт в GCC, но я вполне уверен, что есть варианты компилятораотключить расширения.Это позволит вам заставить компилятор убедиться, что вы не пишете код, который не будет компилироваться с другими компиляторами.


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

3 голосов
/ 11 ноября 2011

Определение вложенной функции (т. Е. Внутри другой функции) является действительным, единственным ограничением является то, что область действия предыдущей функции ограничена включающей функцией.Это как определение локальной переменной.Вы можете найти больше информации здесь: http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html

2 голосов
/ 26 октября 2012

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

#include<stdio.h>;
void main()
{
    int sum()
    {
        int a=30, b=10, c=20, sum=0;
        sum=a+b+c;
        return sum;
    }
    int a;
    a=sum();
    printf("Sum = %d", a);
}

О / р: 60

2 голосов
/ 11 ноября 2011

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

1 голос
/ 11 ноября 2011

Я знаю, что GCC имеет это как расширение. Насколько я знаю, это не часть стандарта.

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