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