Re: Определение функции внутри другой функции

Denis Kirjanov kirjanov at gmail.com
Tue Dec 2 06:22:23 EST 2014


On 12/2/14, Alex Naumov <alexander_naumov at opensuse.org> wrote:
> #include <stdio.h>
>
> int main()
> {
>     int hello();
>     int a;
>     a = hello();
>     printf("%d\n", a);
>     a = hello2();
>     printf("%d\n", a);
>     return 0;//hello();
> }
>
> int hello()
> {
>     int hello2();
>     printf("Hello\n");
>     return 1;
> }
>
> int hello2()
> {
>     return 2;
> }
>

Так это просто обьявление функции. Я думал про такое;

func foo
{
  ..
   func bar
   {
     ...
   }
   ....
}

Что значит адрес на hello2() останется?
вот твоя hello:

hello:
    pushq   %rbp
    movq    %rsp, %rbp
    movl    $.LC1, %edi
    call    puts
    movl    $1, %eax
    popq    %rbp
    ret


> По идеи hello2() объявляется внутри hello(), тем не менее hello2() видна и
> после выполнения hello(). А как же локальные переменные, которые должны
> быть уничтожены после выполнения hello()? Адрес на hello2() остается, т.е.
> мы имеем дело с внешним связыванием, несмотря на то, что функция не
> обявлена за пределами какого-то блока.
>
> 2014-12-02 12:04 GMT+01:00 Alex Naumov <alexander_naumov at opensuse.org>:
>
>> Я работаю с gcc 4.8.1 на x86_64. Мне, в принципе, больше ничего и не
>> надо,
>> т.е. код пишу для себя.
>>
>> Дело даже не в том, на сколько это полезно и в каких случаях. Мне просто
>> интересно какие могут быть проблемы в данном случае. Стоит ли быть
>> тревогу,
>> если встречается такой код?
>> Вот Андрей написал о проблеме переноса кода на другие архитектуры. Это
>> да.
>> Код всегда нужно тестировать при переносе. Но может быть есть проблемы,
>> которые можно встретить в данном случае с 100% вероятностью?
>>
>> 2014-12-02 11:31 GMT+01:00 Denis Kirjanov <kirjanov at gmail.com>:
>>
>>> А какие компиляторы ты пробовал?
>>>
>>> Я просто не понимаю зачем это может быть полезно. Я не видел кода на C
>>> который использует nested functions.
>>>
>>> On 12/2/14, Alex Naumov <alexander_naumov at opensuse.org> wrote:
>>> > Мне не совсем понятно значение "do not support" в данном контексте.
>>> > Это
>>> > работет.
>>> > Поведение программы не определено, т.е. никогда нельзя знать наверняка
>>> как
>>> > поведет себя программа в данном случае?
>>> >
>>> >
>>> > 2014-12-02 11:10 GMT+01:00 Denis Kirjanov <kirjanov at gmail.com>:
>>> >
>>> >> Standard C and C++ do not support nested functions, but:
>>> >> GCC supports nested functions in C, as a language extension.[5]
>>> >>
>>> >> On 12/2/14, Alex Naumov <alexander_naumov at opensuse.org> wrote:
>>> >> > Всем привет.
>>> >> >
>>> >> > У К&R в 4.3 главе написано:
>>> >> > "Сами по себе функции - всегда внешние, поскольку в C нельзя
>>> определить
>>> >> > функцию внутри другой функции."
>>> >> >
>>> >> > Тем не менее, определить функцию f() внутри тела функции main() и
>>> >> > вызвать
>>> >> > её можно без проблем. Более того, в главе 4.2 у K&R присутствует
>>> такой
>>> >> > пример. Кто что думает по поводу объявления функций внутри других
>>> >> функций?
>>> >> > Какие подводные камни ожидают программиста в этом случае?
>>> >> >
>>> >> >
>>> >> > Alex
>>> >> >
>>> >>
>>> >>
>>> >> --
>>> >> Regards,
>>> >> Denis
>>> >>
>>> >
>>>
>>>
>>> --
>>> Regards,
>>> Denis
>>>
>>
>>
>


-- 
Regards,
Denis


More information about the Kernel-russian mailing list