функция внутри функции - PullRequest
       12

функция внутри функции

3 голосов
/ 15 марта 2011
function1()
    {
        statement1;
        statement2;
        function2()
        {
                statement3;
                statement3;
        }
    } 

почему элемент управления не входит в функцию2, даже если тип возвращаемых данных обеих функций одинаков

Ответы [ 4 ]

11 голосов
/ 15 марта 2011

Если вы хотите войти в function2, вы должны вызвать его. Тот факт, что вы помещаете ее в другую функцию, не означает, что она будет выполнена, но все же объявлена ​​и определена. Вы должны явно назвать это

function1()
    {
    statement1;
    statement2;
    function2()
    {
            statement3;
            statement3;
    }
 function2();

} 

И действительно, Std C не позволяет этого. Но это все еще зависит от вашего компилятора, поэтому, если вы делаете это с какой-то целью, проверьте с вашим компилятором, в противном случае просто извлеките объявление function2 из блока function1

5 голосов
/ 15 марта 2011

Это не законный C, как определено стандартом.Он даже компилируется?

Обновление : при условии, что GCC, CoolStraw ответ правильный.

3 голосов
/ 15 марта 2011

На этот вопрос уже дан ответ здесь: Вложенная функция в C

1 голос
/ 23 августа 2011

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

Как сказал Мат, определение функции внутри функции не разрешено стандартом C.Это расширение gcc, также поддерживаемое компилятором IBM XLC.

Тип результата функции по умолчанию имеет значение int начиная с оригинального K & R C приблизительно 1970 года, и до сих пор является частью всех стандартов C.Это не псевдокод или дополнительный код gcc.Обычно это не рекомендуется, потому что скрывает ошибки;например, если вы забудете «#include» и используете строковую функцию, возвращающую указатель, по умолчанию будет возвращаться int.Если эти типы имеют одинаковый размер, вам это сойдет с рук, но в 64-битном режиме с 32-битными целыми числами отбрасывание верхней половины указателя и замена его расширением знака нижней половины является неприятной ошибкой.

Многие компиляторы могут выдавать какое-то сообщение с предупреждением о том, что вы пропустили тип функции, и многие также предупреждают, что вы вызываете не пустую функцию без использования результата.Оба законны, оба могут быть именно тем, что вы хотели, но оба могут быть ошибками.И большинство компиляторов могут также предупреждать о нестандартных совместимых расширениях, таких как вложенные функции gcc.Если вы заботитесь о переносимости, включите такие предупреждения.

...