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