<div dir="ltr"><div>#include <stdio.h><br><br>int main()<br>{<br> int hello();<br> int a;<br> a = hello();<br> printf("%d\n", a);<br> a = hello2();<br> printf("%d\n", a);<br> return 0;//hello();<br>}<br><br>int hello()<br>{<br> int hello2();<br> printf("Hello\n");<br> return 1;<br>}<br><br>int hello2()<br>{<br></div><div> return 2;<br>}<br><br><br></div><div>По идеи hello2() объявляется внутри hello(), тем не менее hello2() видна и после выполнения hello(). А как же локальные переменные, которые должны быть уничтожены после выполнения hello()? Адрес на hello2() остается, т.е. мы имеем дело с внешним связыванием, несмотря на то, что функция не обявлена за пределами какого-то блока.<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">2014-12-02 12:04 GMT+01:00 Alex Naumov <span dir="ltr"><<a href="mailto:alexander_naumov@opensuse.org" target="_blank">alexander_naumov@opensuse.org</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Я работаю с gcc 4.8.1 на x86_64. Мне, в принципе, больше ничего и не надо, т.е. код пишу для себя.<br><br></div>Дело даже не в том, на сколько это полезно и в каких случаях. Мне просто интересно какие могут быть проблемы в данном случае. Стоит ли быть тревогу, если встречается такой код?<br>Вот Андрей написал о проблеме переноса кода на другие архитектуры. Это да. Код всегда нужно тестировать при переносе. Но может быть есть проблемы, которые можно встретить в данном случае с 100% вероятностью?<br></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">2014-12-02 11:31 GMT+01:00 Denis Kirjanov <span dir="ltr"><<a href="mailto:kirjanov@gmail.com" target="_blank">kirjanov@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">А какие компиляторы ты пробовал?<br>
<br>
Я просто не понимаю зачем это может быть полезно. Я не видел кода на C<br>
который использует nested functions.<br>
<div><div><br>
On 12/2/14, Alex Naumov <<a href="mailto:alexander_naumov@opensuse.org" target="_blank">alexander_naumov@opensuse.org</a>> wrote:<br>
> Мне не совсем понятно значение "do not support" в данном контексте. Это<br>
> работет.<br>
> Поведение программы не определено, т.е. никогда нельзя знать наверняка как<br>
> поведет себя программа в данном случае?<br>
><br>
><br>
> 2014-12-02 11:10 GMT+01:00 Denis Kirjanov <<a href="mailto:kirjanov@gmail.com" target="_blank">kirjanov@gmail.com</a>>:<br>
><br>
>> Standard C and C++ do not support nested functions, but:<br>
>> GCC supports nested functions in C, as a language extension.[5]<br>
>><br>
>> On 12/2/14, Alex Naumov <<a href="mailto:alexander_naumov@opensuse.org" target="_blank">alexander_naumov@opensuse.org</a>> wrote:<br>
>> > Всем привет.<br>
>> ><br>
>> > У К&R в 4.3 главе написано:<br>
>> > "Сами по себе функции - всегда внешние, поскольку в C нельзя определить<br>
>> > функцию внутри другой функции."<br>
>> ><br>
>> > Тем не менее, определить функцию f() внутри тела функции main() и<br>
>> > вызвать<br>
>> > её можно без проблем. Более того, в главе 4.2 у K&R присутствует такой<br>
>> > пример. Кто что думает по поводу объявления функций внутри других<br>
>> функций?<br>
>> > Какие подводные камни ожидают программиста в этом случае?<br>
>> ><br>
>> ><br>
>> > Alex<br>
>> ><br>
>><br>
>><br>
>> --<br>
>> Regards,<br>
>> Denis<br>
>><br>
><br>
<br>
<br>
</div></div><span><font color="#888888">--<br>
Regards,<br>
Denis<br>
</font></span></blockquote></div><br></div>
</div></div></blockquote></div><br></div>